3 基本数据
go的数据类型分为四大类:基础类型、聚合类型、引用类型和接口类型
3.1 整数
1.go同时具有符号整数和无符号整数。分别为int8,int16,int32,int64;uint8,uint16,uint32,uint64
2.此外还有两种类型int和uint
3.rune是int32类型的同义词,常常用于指明一个值是Unicode码点;byte是int8的同义词,强调一个值是原始类型而非量值
4.最后还有一种无符号整数uintptr,其大小并不明确,但能够完整存放指针,仅用于底层编程
5.int,uint 和uintptr都有别于大小明确的相似类型的类型
6.有符号整数以补码表示
二元操作符
按照优先级排列如下:
* / % << >> & &^
+ - | ^
== != < <= > >=
&&
||
4 符合数据类型
4.2 slice
创建slice:
- make([]T,len)
- make([]T,len,cap)
4.2.1 append函数
//不是内置函数的扩容策略哦
func appendInt(x []int,y int){
var z []int
zlen :=len(x)+1
if zlen <= cap(x){
z=x[:zlen]
}else{
zcap := zlen
if zcap<2*len(x){
zcap = 2*len(x)
}
z = make([]int,zlen,zcap)
copy(z,x)
}
z[len(x)]=y
return z
}
4.2.2 就地修改
4.3 map
- map 是散列表的引用,map的类型是map[K]V
- 键的类型K,必须是可以通过==来进行比较的类型,浮点数因为NaN的存在,不要用来做键
//创建
ages := make(map[string]int)
//字面量创建
ages := map[string]int{
"alice":31,
"charlie":34
}
//删除元素
delete(ages,"alice")
//如果元素键值不存在,访问操作仍然安全,返回值类型的0值
ages["bob"] = ages["bob"]+1
ages["bob"]++
//无法获取map元素的地址,以下操作是非法的
_ = &ages["bob"]
//for循环map中的键和值
for name,age := range ages{
fmt.printf("%s %d
",name,age)
}
//map中的元素顺序是随机的,字符串类型的key可以使用sort包中的strings函数来进行排序
sort.Strings(names)
//map类型的零值是nil,即没有引用任何散列表
//除了向零值map中设置元素会导致错误外,其他大多数map操作是安全的,和空map一致
//有时候,需要知道一个元素是否在map中
age,ok := ages["bob"]//ok 返回一个布尔值,用来报告元素是否存在于map中
//map除了和nil比较外,其他比较都不合法,比较两个map必须写一个循环
//有时候需要使用不能比较的类型来做键,比如slice,这时需要一个帮助函数将slice转换成字符串,然后用作键
4.4 结构体
//结构体的成员可以通过点号来访问
//或者获取成员变量的地址,然后通过地址来访问
position :=&dilbert.Position
*position ="Senior "+ *position
//点号也可以用在结构体指针上
var employeeOfTheMonth *Employee = &dilbert
employeeOfTheMonth.Position +=" (proactive team player)"
//等价于
(employeeOfTheMonth).Position += "( procative team player)"
//成员变量的顺序对于结构体的同一性很重要,如果交换了两个变量的位置,那么就定义了不同的结构体类型
//如果一个成员变量是首字母大写的,那么这个变量是可导出的,这是GO的主要的访问控制机制
//命名结构体类型不可以定义一个具有相同结构体类型s的成员变量,也就是一个聚合体类型不可以包含它自己,但是可以定义s的指针类型
//结构体的零值由结构体成员的零值组成
//没有任何成员变量的结构体称为空结构体,写作struct{}
4.4.1 结构体字面量
//结构体类型的值可以通过结构体字面量来设置
type Point struct{X,Y int}
p:=Point{1,2}
//通过指定部分或者全部成员变量的名称和值来初始化结构体变量
anim := gif.GIF{LoopCount:nframes}
//通常结构体都通过指针方式调用,因此可以使用一种简单的方式来创建和初始化
pp:=&Point{1,2}
//等价于
pp:=new(Point)
*pp=Point{1,2}
4.4.2 结构体比较
如果结构体的成员变量都是可比较的,那么这个结构体就是可比较的
4.4.3 结构体嵌套和匿名成员
//Go允许我们定义不带名称的结构体成员,只需要指定类型即可;这种结构体成员称作成员变量。这个结构体成员的类型必须是一个命名类型或者指向命名类型的指针
//嵌套的结构体只能这么来初始化
w = Wheel{Circle{Point{8,8},5},20}
//或者
w = Wheel{
Circle:Circle{
Point:Point{X:8,Y:8},
Radius:5,
},
Spokes:20,//尾部的逗号是必须的
}
以快捷方式访问匿名成员的内部变量的同样适用于访问匿名成员的内部方法。