go new和make区别

new用于任何类型,返回的是指针,多用在对象,结构体

make类型只用于slice,map,channel,返回引用,为什么只这三个用make,因为它们都有要初始化的数据,参数golang 内置函数new()和make()的区别

示例

package main

import (
	"fmt"
)

func main() {
	
	var aa []int
	cc := []int{13, 2, 34}
	// 打印 [13 2 34]
	fmt.Println(cc)
	// 打印的是切片数组地址,切片内存【数组址址-长度-容量】,cc内容以指针显示就是打印了前面的指针地址
	fmt.Printf("%p\n", cc)
	// 打印切片变量地址,内址地址以指针显示打印
	fmt.Printf("%p\n", &cc)
	// 打印 &[13 2 34]
	fmt.Println(&cc)

	fmt.Println(&aa)
	fmt.Printf("%p\n", aa)
	fmt.Printf("%p\n", &aa)

	// 修改后切片变量地址不变,切片数组地址改变
	aa = []int{13, 34}
	fmt.Println(&aa)
	fmt.Printf("%p\n", aa)
	fmt.Printf("%p\n", &aa)

	dd := []int{13, 2, 34}
	// 和dd共用一个数组,dd,ee元素改变会相互影响
	ee := dd[1:3]
	ee[1] = 100
	// append会改变切片的数组地址
	ee = append(ee, 1111)
	ee[1] = 200
	fmt.Println(dd)
	fmt.Println(ee)

}

切片cap容量够的话append不会增加改变数组地址

[x:y]容量为原切片容量-x

package main

import (
	"fmt"
)

type Animal struct {
}

func (m *Animal) Eat() {
	fmt.Println("Eat")
}

func main() {
	rr := make([]int, 3, 5)

	rr[0] = 12
	rr[1] = 112
	rr[2] = 1222

	cc := rr[0:2]
	fmt.Println(len(cc))
	fmt.Println(cap(cc))

	// 打印 [13 2 34]
	fmt.Println(cc)
	// 打印的是切片数组地址
	fmt.Printf("%p\n", cc)
	// 打印切片变量地址
	fmt.Printf("%p\n", &cc)
	// 打印 &[13 2 34]
	fmt.Println(&cc)

	cc = append(cc, 22)

	// 打印的是切片数组地址
	fmt.Printf("%p\n", cc)
	// 打印切片变量地址
	fmt.Printf("%p\n", &cc)
	fmt.Println(&cc)
	// fmt.Println(&dd)
}
package main

import "fmt"

func SlicePrint(s []int)  {
	s=append(s,0)
	for i:=range s{
		s[i]++
	}
}
func main() {

	s1:=[]int{1,2}
	s2:=s1

	s2=append(s2,3)
	s1=append(s1,3)
	fmt.Println(len(s2),cap(s2))
	fmt.Println(len(s1),cap(s1))
	SlicePrint(s1)
	SlicePrint(s2)
	fmt.Println(s1,s2)
	fmt.Printf("%p\n", s1)
	fmt.Printf("%p\n", s2)
	fmt.Println(len(s2),cap(s2))
}

append多个数不够时就两个两个的增加cap,而append单个时如果不够就会扩容两倍

go1.17 append(x,1,2,3)cap是3不是4

package main

import "fmt"

func main() {

	var s1 []int = []int{1,2}

	fmt.Println(len(s1),cap(s1))
	s1=append(s1,32)

	fmt.Println(len(s1),cap(s1))
	s1=append(s1,32)

	fmt.Println(len(s1),cap(s1))
	s1=append(s1,32)

	fmt.Println(len(s1),cap(s1))

	var s2 []int

	fmt.Println(len(s2),cap(s2))
	s2=append(s2,32)

	fmt.Println(len(s2),cap(s2))
	s2=append(s2,32)

	fmt.Println(len(s2),cap(s2))
	s2=append(s2,32)

	fmt.Println(len(s2),cap(s2))

	s2=append(s2,32,3,4,1,1,2,1,2)

	fmt.Println(len(s2),cap(s2))
	s2=append(s2,32,3,4,1,1,2,1,2)

	fmt.Println(len(s2),cap(s2))
	s2=append(s2,3)

	fmt.Println(len(s2),cap(s2))
}
原文地址:https://www.cnblogs.com/wahgon/p/15472825.html