基本数据类型
布尔
声明时若不指定,默认false
整型
byte, int, int8, int16, int32, int64, uint, uint16, uint32, uint64, uintptr
byte = uint8 占8位
浮点
float64, complex128
复数 complex128 由两个float64组成,实部和虚部 方法
var v = complex(2.1,2)
a := real(v)
b := image(v)
字符:rune
实际上是int32 默认编码是utf-8 所以需要4个字节
字符串:string
- 常量 只读,不能通过索引修改值
- 可以转化为[]byte 但是慎用,会复制内容,开销大(也可以转为[]rune)
a := "a string"
b := []byte(a)
c := []rune(a)
- 底层实现,类似stl-string,尾部没有空字符,存储形式是
字符数组起始地址(指针)+长度
type stringStruct struct{
str unsafe.Pointer
len int
}
- 对字符串切片返回的还是string,不是切片,与底层实现有关
b := a[0:4]
// 可以省略一边
b := a[:4]
- 运算
a := "hello "
b := "world"
// 拼接
c := a + b
d := len(c)
// 按字节遍历数组
for i := 0; i < len(c); i++ {
fmt.PrintIn(d[i])
}
// 按字遍历数组
for i, v := range c {
fmt.PrintIn(i,v)
}
错误:error
复合数据类型
* pointType
[n] elementType
[] elementType
map [keyType]valueType
chan valueType
struct {
feildName feildType
feildName feildType
...
}
interface {
method1(inputParams)(returnParams)
method2(inputParams)(returnParams)
...
}
指针
*和&的使用同C- 没有
->,结构体指针访问结构体成员也用. - 不支持指针运算
- 允许返回局部变量的地址(比如函数内部变量)in heap
数组
长度在初始化时就固定了,并且相同元素类型长度不同的数组是不同类型的
操作
a := [3]int{1,2,3}
a := [...]int{1,2,3}
// 指定索引,没有的设为类型默认值
a := [3]int{1:1,2:2}
// a = [1,2,0]
a := [...]{1:1,2:2:2}
// a = [1,2] 长度推断为出现的最大索引值
访问:
- 索引
- len方法
- 两种for循环
切片
变长数组,像vector
底层实现
type slicew struct {
array unsafe.Pointer
len int
cap int // 容量
}
初始化
s := array[start:end]
// 0-len 可省略 左闭右开
s := make([]int, 10)
// 类型 容量
s := make([]int, 10, 15)
// 类型,长度,容量
不赋值的话,array指针值为nil
操作
- len(s)
- cap(s)
- append(s,newElement)
- copy(des, src)
copy部分的长度是 两者最短长
字典
初始化
m := map[string]int{"a":1,"b":2}
fmt.PrintIn(m["a"])
// 用make
// 默认容量
m1 := make(map[int]string)
// 指定容量
m2 := make(map[int]string, 10)
操作
- 访问和修改 直接用[key]
- 可以用range遍历,但是是乱序,每次不一定一样
for k,v := range mp {
fmt.PrintIn("key=", k, "value=", v)
}
- 删除键
// delete(mapName,key)
delete(m,1)
- 键值对数量 len(m)
- 不是并发安全的,并发安全的可以用包
sync中的map- 不能通过
map[key].key修改value结构体内部的值,整体替换value
结构
type TypeName struct {
FieldName FieldType
FieldName FieldType
FieldName FieldType
...
}
type Person struct {
Name string
Age int
}
// 初始化方法
a := Person{"Jerry", 21}
// 不好,如果struct新增字段,会报错,最好指定name
a := Person{
Name: "Jerry",
Age: 12,
}