基本类型
整数
1 | int8 int16 int32 int64 uint8 uint16 uint32 uint64 |
浮点数
1 | float32 float64 |
复数
1 | complex64 complex128 //两者分别由float32 float64构成 |
布尔
1 | bool |
字符串
- 四个字符串处理包
- strings:搜索、替换、比较、修整、切分与连接字符串
- bytes:用于操作字节slice
- strconv:类型转换,用于布尔值、整数、浮点数的相互
- unicode:判别文字符号值特性
- string 直接通过[]获取sliece,从而操作字符
指针
1 | var a int |
- go的指针不能算术运算,即不能偏移
- new():构造一个变量,并返回指针,
p := new(int)
与var a int;var p *int = &a
并无差别
数组
1 | var a [3]int |
- 数组支持
==
,但前提是元素类型是可比较的 - go的数组传递,是值传递
slice
1 | var a [...]int = {1,2,3} //底层数组 |
- slice是一种引用类型,需要底层数组作为支撑
- 三个属性:指针,容量,长度,
len()
和cap()
分别返回长度与容量,引用若超过了容量,会宕机 - slice唯一允许的比较操作是与nil比较,含义为是否有底层数组;检查slice是否为空使用的是
len(s) == 0
,不能使用s==nil
make([]T,len,cap)
或者make([]T,len)
:创建无名数组,并返回一个slice ,格式为append([]T,T)
:在slice后面加元素,如果容量不足,则创建一个新的底层数组,用于存放slicecopy([]T,[]T)
:第一次目的,第二个源
map
1 | //格式:map[K]V |
- map使用引用类型,底层实现为散列表
delete(map,K)
:从map中删除元素- map设置元素前,必须初始化(make或者赋予初值)
- map的元素不是一个变量,不可以对元素取地址
- 与slice不同,map是不可以比较
- go没有集合(set),可以用map[K]bool或者其他代替
- map的key值类型,必须是可比较的类型
结构体
1 | type Employee struct{ |
go中没有
->
,指针也是用.
首字大写表示,变量可导出(public)
出于效率考虑,大型的结构体建议用指针进行传递
小写的成员变量,为内部变量,无法直接初始化
1
2type point struct{x,y int};
p := point{1,2} //编译出错,x,y 不可访问成员初始化,不建议直接赋值,建议名称+值的方式初始
1
2
3type Point struct{X,Y int};
p := Point{1,2} //代码不易理解,且不方便扩展成员变量,不利于代码维护
P := Point{X: 3,Y: 3} //建议使用这种方式初始化可比较性:如果成员均可以比较,该结构体可比较
匿名成员与结构体嵌套的最主要意义在于:实现了面向对象中的继承
1
2
3
4
5type Point struct{X,Y int};
type Circle struct{
Point
Radius int
}结构体与JSON的相互转换,依赖encodeing/json 包,通过反射实现
结构体转JSON:
json.Marshal([]T) string error
JSON转结构体:
json.Unmarshal(string,*[]T) error
成员标签定义:用于给成员进行重名命以及标识
1
Color bool `json:”color,omitempty”`