这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
本节课的重要知识点
1.切片
//定义
s:=make([]string,3)//第一种
a:=[]string{"n","i","c","e"}//第二种
中括号后面的为切片的数据类型
切片比数组使用的范围更广,因为切片可以在任意时候改变大小。
下面介绍切片append的用法
a:=[]string{"n","i","c","e"}
a=append(a,"d")
a=append(a,"e")
当使用append时,务必要写成此种形式,因为append返回的是一个新的切片不是直接改变原来的切片,因此使用append之后还要重新赋值回去。
另外还有一个重要的点就是,go里面的切片是不支持负数索引的。
2.map
map是使用频繁的数据结构,下面看看它的代码
m :=make(map[string]int)
m["one"]=1
m["two"]=2
m1 :=map[string]int{"one":1, "two":2};
var m2=map[string]int{"one":1, "two":2};
以上都是map的定义及赋值形式
map还有一个特殊的用法
i := m["route"]//如果route这个键存在就返回那个值
//如果不存在根据value的类型如果是string返回“”,如果是int就返回0。
i,ok:=m["ttt"];
//一般用此句来检测map中的ttt键是否删除成功,i返回0,ok返回false
这里可以参考go语言圣经里的一段解释
map还有一个重要的特点是元素的排列是无序的,完全随机。
package main
import (
"fmt"
)
func main() {
m1 := map[string]int{"one": 1, "two": 2}
var m2 = map[string]int{"one": 1, "two": 2}
for k, v := range m1 {
fmt.Println(k, v)
}
for k, v := range m2 {
fmt.Println(k, v)
}
}
从以上的代码运行结果和代码来看确实如此。
3.range遍历
数组遍历第一个位置i(index)是索引,第二个位置num是该位置的值;map遍历第一个位置k(key)是键,第二个位置v(value)是值
另外数组遍历时若不想遍历索引可以使用下划线代替i位置
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
for _, num := range a {
fmt.Println(num)
}
}
4.函数
go里面的函数是支持多个返回值的,在真正的业务代码逻辑中第一个值返回的是真正的值,第二个返回值是错误信息。 下面是一个有两个返回值的函数
package main
import "fmt"
func add(a int, b int) (int, int) {
return a, b
}
func main() {
a, b := add(1, 2)
fmt.Println(a, b)//1 2
}
5.JSON处理
结构体里面的字段首字母必须要大写才可以用jsno调用marshal函数,打印时需要用强制字符串类型转换,否则会打印出一些16进制的编码。
序列化之后也可以反序列化到一个空的变量里面
一般输出都是按照字段名输出,如有特殊要求可以加一个tag标签控制json的输出。
package main
import (
"encoding/json"
"fmt"
)
type human struct {
Name string
Age int `json:"age"`
sex string
}
func main() {
a := human{"wang", 18, "男"}
buf, err := json.Marshal(a)
if err != nil {
panic(err)
}
fmt.Println(buf)
fmt.Println(string(buf))
}
总结
总体来说今天只是go语言的基础部分,难点不多,只是需要记一些语法上的规范,有一些代码的规范和我之前学的c++比起来有很大的不同,因此需要适应一段时间。今天的笔记就分享到这里,明天继续加油。