切片
slice(切片)
arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6] s就是一个切片,s的值为[2 3 4 5],包括2,但是不包括6
s := arr[:6] = [0 1 2 3 4 5]
s := arr[2:] = [2 3 4 5 6 7]
s := arr[:] = [0 1 2 3 4 5 6 7]
arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6]
s[0] = 10
arr 的值变为 [0 1 10 3 4 5 6 7],所以slice本身没有数据,是对底层array对一个view
slice可以向后扩展,不可以向前扩展
s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
向slice添加元素:
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
s2 := s1[3:5]
s3 := append(s2, 10)
s4 := append(s3, 11)
s5 := append(s4, 12)
添加元素时如果超越cap,系统会重新分配更大对底层数组
由于值传递对关系,必须接收append对返回值。
s = append()
map
m := map[string]string {
"name" : "ccmouse",
"course" : "golang",
"site" : "imooc",
"quality" : "notbad"
}
**定义map: **
map[K]V 复合形式的:map[K1]map[K2]V
map的操作:
创建:make(map[string]int)
获取元素:m[key]
key不存在时,获得value类型的初始值
用value,ok := m[key] 来判断是否存在key
用delete删除一个key
map的遍历:
使用range遍历key,或者遍历key,value对
不保证遍历顺序,如需顺序,需要手动对key排序
使用len获得元素个数
map的key:
map使用哈希表,必须可以比较相等
除了slice,map,function的内建类型都可以作为key
struct类型不包含上述字段,也可以作为key
字符串:
rune相当于go的char
使用range遍历pos,rune对
使用utf8.RuneCountInString获得字符数量
使用len获得字节长度
使用[]byte获得字节
其他字符串操作:
fields, split, join
contains, index
tolower, toupper
trim, trimright, trimleft
面向对象:
go语言仅支持封装,不支持继承和多态
go语言没有class,只有struct
结构的定义:
type TreeNode struct {
left, right *treeNode
value int
}
不论地址还是结构本身,一律使用 . 来访问成员。
只有使用指针才可以改变结构内容
nil指针也可以调用方法
值接收者 VS 指针接收者:
要改变内容必须使用指针接收者
结构过大也考虑使用指针接收者
一致性:如有指针接收者,最好都是指针接收者
值接收者是 go 语言特有
值/指针接收者均可接收值/指针
封装:
名字一般使用CamelCase
首字母大写:代表public
首字母小写:代表private
包:
每个目录一个包
main包包含可执行入口
为结构定义的方法必须放在同一个包内
可以是 不同的文件
如何扩充系统类型或者别人的类型:
定义别名
使用组合
官方推荐:所有项目和第三方库都放在同一个GOPATH下
也可以将每个项目放在不同的GOPATH
网友评论