Golang基础——1

发布于 2021-02-25  164 次阅读


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

只是我心中不再有火花,就让往事随风去吧。