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{}