make & new
make 创建 slice | map | chan ,返回引用类型
map:键值对,唯一key,长度不可变,无序(关联数组)
slice:一种特殊的数组,长度可变
chan:管道,用于线程之间的通信
指针和引用的区别,引用类型 vs 指针类型
& 获取内存地址
* 解析内存地址,获取地址对应的变量的值
如下:
a := 1
b := &a
变量b被赋值为变量a的内存地址
*b是指针,其值是1,也就是变量a的值
//make创建slice
func makeSlice() {
//make([]数据类型 ,len ,cap)
mSlice := make([]string, 3, 5)
mSlice[0] = "test1"
mSlice[1] = "test2"
mSlice[2] = "test3"
}
//[test1 test2 test3]
----------------------------------------------------------------------
/**
//创建切片的方式
var a []int // nil 切片,和 nil 相等,一般用来表示一个不存在的切片
b := []int{} // 空切片,和 nil 不相等,一般用来表示一个空的集合
c := []int{1, 2, 3, 4} // 有 4 个元素的切片,len 和 cap 都为 4
d := c[:2] // 有 2 个元素的切片,len 为 2,cap 为 4
e := c[0:2:cap(c)] // 有 2 个元素的切片,len 为 2,cap 为 4
f := c[:0] // 有 0 个元素的切片,len 为 0,cap 为 4
g := make([]int, 3) // 有 3 个元素的切片,len 和 cap 都为 3
h := make([]int, 3, 5) // 有 3 个元素的切片,len 为 3,cap 为 5
i := make([]int, 0, 5) // 有 0 个元素的切片,len 为 0,cap 为 5
**/
______________________________________________________________________
//make创建map
func makeMap() {
mMap := make(map[int]string)
mMap[5] = "m5"
mMap[9] = "m9"
mMap[11] = "m11"
}
//map[5:m5 9:m9 11:m11]
______________________________________________________________________
//make创建chan
func makeChan() {
mChan := make(chan int, 3)
}
//chan int
new开辟一片内存空间,内存置零,返回指针类型
//new创建map
func newMap() {
nMap := new(map[int]string)
fmt.Println(reflect.TypeOf(nMap))
}
//*map[int]string
小结:
new返回是指针类型,make返回是引用类型
make
只能用来创建slice map chan 三种类型内置的数据结构,由系统进行了初始化,可以直接使用
new
的作用是为类型申请一片内存空间,并返回指向这片内存的指针
append & copy & delete
slice:append & copy
map:delete
//append
func main() {
a := make([]string, 2)
a[0] = "11"
a[1] = "22"
fmt.Println(a)
a = append(a, "33")
fmt.Println(a)
}
//[11 22]
//[11 22 33]
//append 自动扩容
______________________________________________________________________
//copy
func main() {
a := make([]string, 2)
a[0] = "11"
a[1] = "22"
fmt.Println(a)
c := make([]string, 2)
c[0] = "111"
c[1] = "222"
fmt.Println(a)
copy(a, c)
fmt.Println(a)
}
//[11 22]
//[111 222]
//[111 222]
//c覆盖a,长度以a为准
______________________________________________________________________
//delete
func main() {
a := make(map[int]string)
a[0] = "test1"
a[1] = "test2"
a[2] = "test3"
fmt.Println(a)
delete(a, 1)
fmt.Println(a)
}
//map[0:test1 1:test2 2:test3]
//map[0:test1 2:test3]
len & cap & close
len:string|arr|slice|map|chan
cap:slice|map|chan
close:chan
//len长度 & cap容量
func main() {
a := make([]string, 2)
a[0] = "11"
a[1] = "22"
fmt.Println(a)
fmt.Println(len(a))
fmt.Println(cap(a))
}
//[11 22 ] 后面有空格
//3
//5
______________________________________________________________________
//close
func main() {
a := make(chan int, 5)
a <- 1
a <- 2
//defer close(a) 业务常用写法
close(a)
fmt.Println(a)
}
//0xc00007c000
Comments NOTHING