1、数据类型
go语言支持的基础类型:
整型:int,int8,int16,int32,int64
无符号整型:uint,uint8,uint16,uint32,uint64
其中默认类型为int,int表示32位或64位与操作系统有关
字节:byte
布尔:bool
浮点型:float32,float64,默认类型为float64
复数:complex64(32位实部和虚部),complex128(63位实部和虚部),默认类型为complex128
指针:uintptr,本质为无符整型uint8
字符串:string
字符:rune,本质为int32,可表示unicode编码
错误类型:error,本质为接口
go支持的复合类型:
指针*,数组,结构体struct
切片slice,字典map,通道channel,接口interface
基础类型的默认值:
数据类型 | 默认值 |
整型 | 0 |
浮点型 | 0 |
布尔值 | false |
字符串 | "" |
值类型和引用类型:
值类型和引用类型的区别在于,在赋值或作为函数参数调用时,值类型会复制一份新的拷贝,新数据的修改不会影响原数据,而引用类型只会复制变量的引用,引用数据的修改会影响原数据
值类型:基础数据类型,指针,数组,结构体
引用类型:切片,map,channel,interface
数组和切片的定义:
// 数组定义 a :=[5]int{1,2,3,4,5} a := [...]int{1,2,3,4,5} // 切片定义 a :=[]int{1,2,3,4,5} a := a[1:3]
切片底层实际是一个三元组:指针、len、cap
使用make创建切片
make是Go语言的内置函数 mySlice1 := make([]int, 5) //元素个数为5 ,初始值为0 mySlice2 := make([]int, 5, 10) //len为5,cap为10 mySlice3 := []int{1, 2, 3, 4, 5} //len为5,cap为5 mySlice4 := mySlice3 [1:3] // len为2,cap为4,容量为1到最后
切片的容量增长:
函数append会智能地处理底层数组的容量增长,在切片容量小于1000个元素时, 总是会成倍地增加容量,一旦元素个数超过1000,时,容量的增长因子会设为1.25,也就是每次增加25%的容量
各个类型所占的内存(64位环境):
指针类型:8个字节
string类型:16个字节,包含一个指针,指向真实地址,和一个int类型表示长度
数组类型:总字节数为单个元素占用大小乘以个数
切片类型:包含一个指向数组的指针,一个int类型表示长度,一个cap类型表示容量,总共24字节
map类型:8个字节,本身为一个指针,指向map自己
struct类型:大小为所有成员大小的总和
interface{}:占用内存为16字节,包含两个指针
map定义:
map的键可以使任何值,包括内置类型或结构体,只要可以用==进行比较,但不能是切片、函数以及包含切片的数据结构由于具有引用语义不能作为映射的键
var colors map[string]string colors["red"] = "#da1337" // panic: assignment to entry in nil map
声明和初始化:
colors := make(map[string]string) colors := map[string]string{} 取值:color, ok := colors["red"] 遍历:for k, v := range colors
nil切片和空切片
创建nil切片:var slice []int
创建空切片:
slice := make([]int, 0)
slice := []int{}