当青训营遇上码上掘金
切片
go数组长度是不可变的, 简单理解切片为动态数组, 长度是可以变化的
可以从数组生成切片(和python的切片操作差不多)
var a = [3]int{1, 2, 3}
fmt.Println(a, a[1:2]) // [1 2 3] [2]
// start ,end 底层调用大概是取出的length = end - start 左开右闭
- 声明切片
// 声明字符串切片
var strList []string // ==nil
// 声明整型切片
var numList []int //==nil
// 声明一个空切片
var numListEmpty = []int{} //初始化为空了,!=nil
变量名的命名驼峰
- 使用make()内置函数制造切片 var a := make([]int, 2, 2)
- append内置函数可以为切片动态添加元素(这个重载的方法有点多, 看API)
var a []int
a = append(a, 1) // 追加1个元素
a = append(a, 1, 2, 3) // 追加多个元素, 手写解包方式
a = append(a, []int{1,2,3}...) // 追加一个切片, 切片需要解包
如果空间不足以容纳足够多的元素,切片就会进行“扩容”原来的地址会改变,猜测底层应该和(Stringbuffer)类似
- 内置函数len(), cap()分别表示长度和容量
- copy():Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。
range关键字:循环迭代(返回两个值)
for index, value := range slice {
fmt.Printf("Index: %d Value: %d\n", index, value)
} // index 相当于索引下标
range 关键字不仅仅可以用来遍历切片,它还可以用来遍历数组、字符串、map 或者通道等
range 关键字不仅仅可以用来遍历切片,它还可以用来遍历数组、字符串、map 或者通道等
for _, value := range slice {
fmt.Printf("Value: %d\n", value)
}
map
map 这种数据结构在其他编程语言中也称为字典(Python)、hash 和 HashTable
mapCreated := make(map[string]float)等价于mapCreated := map[string]float{}
map 的遍历过程使用 for range 循环完成
结构体
一个程序就是一个世界, 有很多对象
- 没有类(class), 其中的struct与其他语言的class有同等地位
- 去掉了传统的OPP语言的继承、方法重载、构造函数、隐藏的this指针
- 面向接口编程,用到了极致
结构体名称的大写表示的是可以在其他的包内进行访问, 小写表示私有,内部的变量名称也是一样
如果结构体的字段是: 指针, slice,和map的零值都为nil,表示还没有分配空间,如果要是要使用需要先make()
- 创建的方式
- 直接声明: var person Person
- var person Person = Person{}
- var person *Person = new {Person} new出来的是指向结构体的指针
var p *Person = new {Person}
(*p).Name = "why" // 应该有的写法
p.Name = "why" // go的设计者为了使用方便,在底层做了优化
- var person *Person = &Person{}