走进go语言基础语言:
go基本语法:
1.hello :
package main
import "fmt"
func main() {
}
2.变量:
var a = "initial" //定义变量时,可用var 或 :=
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo" //字符串是内置类型,可通过加号拼接
fmt.Println(a, b, c, d, e, f)
fmt.Println(g)
const s string = "constant" //常量用const来定义,
常量没有确定的类型,一般通过上下文确定类型
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
3.if-else
与C语言不同的是if后面的条件不加括号,多个条件用;分隔。
4.循环
go 只有for循环,for循环条件没有括号
for没有条件会形成死循环
go中也可使用break和continue
5.switch
go 的switch的case当执行完一个后会直接结束switch
package main
import (
"fmt"
"time"
)
func main() {
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("four or five")
case 4, 5:
fmt.Println("fout or five")
default:
fmt.Println("other")
}
t := time.Now()
switch { //不加条件的switch
可以当作多个if-else条件语句使用
case t.Hour() < 12:
fmt.Println`
("It's before noon")
default:
fmt.Println("It's after noon")
}
}
6.数组和切片
- 定义一个定长数组: 1.
var a [5]int2.b := [5]int{1, 2, 3, 4, 5} - make 创建一个可变长数组:
s := make([]string, 3) - go有与python类似的切片,但不支持负数索引
7.map
**map是无序的**
package main
import "fmt"
func main() {
m := make(map[string]int) //map语法:变量 :=make(map[key]value) 此处为空map
m["one"] = 1
m["two"] = 2
fmt.Println(m)
fmt.Println(m["one"])
fmt.Println(m["know"])
r, ok := m["know"]
fmt.Println(r, ok) //ok 可以显示r是否在map中
delete(m, "one")
fmt.Println(m)
m2 := map[string]int{"one": 1, "two": 2} //空值map需要用make()
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2, m3)
}
8.range
range遍历数组会返回索引和值
9.函数和指针
// go函数支持返回多个值,第一个值是返回结果,第二个是错误信息
package main
import "fmt"
func add(a int, b int) int { //括号外的类型是返回值类型
return a + b
}
func add2(a, b int) int {
return a + b
}
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
func main() {
res := add(1, 2)
fmt.Println(res)
v, ok := exists(map[string]string{"a": "A", "b": "B"}, "b")
fmt.Println(v, ok)
}
package main
import "fmt"
func add(n *int) {
*n += 2
}
func main() {
n := 5
add(&n)
fmt.Println(n)
add(&n)
fmt.Println(n)
}
10.结构体
type user struct {
name string
password string
}
func main() {
a := user{name: "wang", password: "1024"}
b := user{"li", "2048"}
c := user{name: "zhang"}
var d user
d.name = "wu"
d.password = "7788"
fmt.Println(a, b, c, d)
fmt.Println(checkPassword(a, "1024"))
fmt.Println(checkPassword2(&a, "gaga"))
}
func checkPassword(u user, password string) bool {
return u.password == password
}
func checkPassword2(u *user, password string) bool {
return u.password == password //使用指针可对结构体修改
}
11.字符串操作和格式化
replace函数的格式:Replace(s, old, new string, n int) string //返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。
a := "hello"
fmt.Println(strings.Contains(a, "ll")) //判断一个字符串里面是否包含一个字符串
fmt.Println(strings.Count(a, "l")) //记录该字符串中有几个后面的字符串
fmt.Println(strings.HasPrefix(a, "he")) //检测字符串是否以指定的前缀开头。
fmt.Println(strings.HasSuffix(a, "llo")) //检查字符串是否以指定的后缀开头
fmt.Println(strings.Index(a, "ll")) //查找字符串的位置
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) //链接字符串
fmt.Println(strings.Repeat(a, 2)) //重复字符串n次
fmt.Println(strings.Replace(a, "e", "E", -1))
fmt.Println(strings.Split("a-b-c", "-")) //在一个字符串中去除指定字符串
fmt.Println(strings.ToLower(a)) //hello
fmt.Println(strings.ToUpper(a)) //HELLO
字符串的格式化:
- 可用%v打印任何类型的变量
- %+v打印出字段的名字和值 例如:p={x:1 y:2}
- %#v打印结构体构造加字段名字和值 p=main.point{x:1,y:2}
12.JSON处理
package main
import (
"encoding/json"
"fmt"
)
type userInfo struct { //golang的JSON操作需要结构体字段第一个字母大写
Name string
Age int `json:"age"` //将Age字段名改成age
Hobby []string
}
func main() {
a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
buf, err := json.Marshal(a) //数列化结构体
if err != nil {
panic(err) //当程序发生panic时,程序会执行当前栈中的defer 函数列表。然后打印引发panic的具体信息,最后进程退出
}
fmt.Println(buf) //数组(16进制编码)
fmt.Println("1:", string(buf)) //强制类型转换才能输出结构体内容
buf, err = json.MarshalIndent(a, "", "\t") //待查
if err != nil {
panic(err)
}
fmt.Println("2:", string(buf))
var b userInfo
err = json.Unmarshal(buf, &b) //反数列化到一个空的变量
if err != nil {
panic(err)
}
fmt.Printf("%#v\n", b)
}