go-切片

2018-11-15  本文已影响5人  5号船长
切片

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

上一篇下一篇

猜你喜欢

热点阅读