Go 语言基础(二)|青训营笔记

83 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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)