Go基础部分
学习Go基础之后的一些重要注意事项
Slice
切片可以理解为三个指针维护下的数组
ptr, len, cap
var arr = [5]int // 标准数组,标准数组直接可以==比较,切片只是个引用,是不能直接比较的
var b = []int{} // 这是已经进行了初始化的,它不等于nil
var slice2 []string // 它等于nil
var slice3 = make([]int, 5, 100) // 给两个初始值,一个是初始化的容量,一个是cap大小
slice3 := make([]int, 0, 16) // 初始一个空的
Map
// map的创建
m = make(map[string]int) // 可以初始化大小也可以不
// map通过这个判断有无key,但是如果一般操作的时候,可以直接用就行,不用初始化不会报错
if v, ok = map["key"]; ok {
fmt.Println(v)
} else {
fmt.Println("not exists")
}
指针
要合理的理解指针,在内存当中,我们的数据都是放在一个专门的地址上的。我们使用的是地址上对应的值。而指针,就是指向这个内存地址的变量。
- *&操作,去获取一个变量的内存地址
- *操作,去读取这个内存地址对应的值
在for循环遍历的时候
for i, v := range str //
这里的v是一个内存空间,每次会指向str的单个值,所以到最后这个空间都是这个值。
再加上go语言中是值传递的,如果是传递指针的值也是值传递,它都是进行一份拷贝以后才会进行方法
Defer
Go语言中的return并不是一个原子操作,它进行了两步
- 对return的值赋值
- 执行ret
而defer做的就是在中间插入一个这个方法的执行,这时已经获取了这个方法所有的args,只是延缓执行罢了。而多个defer,第一个defer的最后执行,相当于它已经融入了ret当中,而下一个还是往中间插入。
经典面试题来了:
闭包
闭包这个概念一开始还是难理解,后面我就干脆不想理解它了,就把一个方法当成是一个变量,它其中的东西都被继承执行了。
结构体
在Go里面只有结构体这个思想的。
结构体对象其实只是一个指针,它指针指向了这个结构体内存的最开始的地方,然后平铺补齐内存
type Student struct {
ID int `json:"id"`
Address string
name string // 小写是一个私有对象,不能在包外访问,也不可以被json序列化
}
type Class struct {
ID int
Students []*Student
*Student // 这是内嵌的方式,可以直接.使用里面的方法,剩下了代码的量
}
func main() {
c := &Class{
Title: "101",
Students: make([]*Student, 0, 200),
}
for i := 0; i < 10; i++ {
c.Students = append(c.Students, &Student{
ID: i,
Gender: "g",
Name: strconv.Itoa(i) + "g",
})
}
//JSON序列化:结构体-->JSON格式的字符串
//私有不能被json包访问
//data, err := json.Marshal(c)
//if err != nil {
// fmt.Println("json marshal failed")
// return
//}
data, err := json.Marshal(c)
if err != nil {
fmt.Println("json marshal failed")
return
}
fmt.Printf("json:%s\n", data)
//JSON反序列化:JSON格式的字符串-->结构体
str := `{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}`
c1 := &Class{}
err = json.Unmarshal([]byte(str), c1)
if err != nil {
fmt.Println("json unmarshal failed!")
return
}
fmt.Printf("%#v\n", c1)
}