这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
基础语法
基础语法 - range
对于一个slice或map,用range快速遍历
slice
nums := []int{2, 3, 4}
for i, num := range nums{...}
map
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m { //输出key和val,随机顺序
fmt.Println(k, v)
}
for k := range m { //只输出key
fmt.Println(k)
}
基础语法 - 函数
Go 语言的函数与其他语言不同,可以返回多个值,比如函数执行成功否的bool值,错误信息值等。
当然也可以返回单一的值
func add(a int, b int) int {
return a + b
}
返回多个值
func exists(m map[string]string, k string) (v string, ok bool) { //返回值和错误信息,正确返回true,错误返回false
v, ok = m[k]
return v, ok
}
调用方法:
res := add(1, 2)
v, ok := exists(map[string]string{"a" : "A"}, "a")
基础语法 - 指针
Go 语言中也有指针,很多情况下使用指针能够使得速度更快,少传递赋值一次。在函数中如果需要修改一个传入的参数,就需要用指针才能修改。
func add2ptr(n *int) {
*n += 2
}
调用函数:
n := 1
add2ptr(&n)
fmt.Println(n) //3
基础语法 - 结构体
在Go 语言中没有类的定义,只有结构体的定义
定义结构体
type 结构体名 struct{...} 定义结构体
例如:
type user struct {
name string
password string
}
初始化结构体
- 用带变量名
a := user{name: "wang", password: "123"} - 不带变量名,按顺序赋值
b := user{"lan", "890"} - 赋单个值
c := user{name: "you"}
注意:如果用var定义,不能像前三行一样直接结构体赋值,要下面这样每个变量分开赋值
var d user
d.name = "po"
d.password = "1009"
结构体函数
指针还能对结构体修改
func checkPassword2(u *user, password string) bool {
return u.password == password
}
基础语法 - 结构体方法
可以用a.xxx调用结构体方法,传入指针修改password
func (u *user) resetPassword(password string) {
u.password = password
}
调用 a.resetPassword("123")
基础语法 - 错误处理
_下划线是丢掉这个参数,可以优化编译器性能
nill相当于C语言中的null
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found") //nil相当于null
}
调用
u, err := findUser([]user{{"wang", "1024"}, {"lan", "123"}}, "wang")
基础语法 - string
strings库中有很多函数可以调用
- 是否包含 strings.Contains(a, "ll")
- 返回个数 strings.Count(a, "ll")
- 是否以此为前缀 strings.HasPrefix(a, "he")
- 是否以此为后缀 strings.HasSuffix(a, "llo")
- 查询下标 strings.Index(a, "ll")
- 连接两个字符串 strings.Join([]string{"he", "llo"}, "-")
- 重复多次 strings.Repeat(a, 2)
- 根据符号切分字符串 strings.Split("a-b-c", "-")
- 把字符串全变成小写 strings.ToLower(a)
- 把字符串全变成大写 strings.ToUpper(a)
基础语法 - JSON处理
介绍如何把结构体转化成json和把json转化成结构体的方法
先定义结构体
type userInfo struct {
Name string //json需要大写字母开头,否则不会显示
Age int `json:"age"` //这样可以在转化成json时变成小写
Hobby []string
}
定义一个结构体变量
a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
把结构体转化成json: buf, err := json.Marshal(a)
转化成string类型输出 fmt.Println(string(buf))
对json格式化处理 buf, err = json.MarshalIndent(a, "", "\t")
把json转成结构体
var b userInfo
err = json.Unmarshal(buf, &b)