1. 程式人生 > 其它 >四. Go學習-make和new的區別

四. Go學習-make和new的區別

技術標籤:Golang學習總結golang

new和make的區別,我們從下圖便可看出:

1)new是為值型別分配記憶體(可以任意型別的資料),其返回的是指標,指向分配型別的記憶體地址。

2)make為引用型別分配記憶體並初始化,如:chan、map和slice,其返回值為這個型別(引用)本身。

3)new 分配的空間被清零。make 分配空間後,會進行初始化;

New函式

一. 為切片分配記憶體

如下面程式碼所示,用new分配一個切片記憶體後,此時slice是空的(&[]),僅僅聲明瞭一個指標指向這個空的slice的地址。如果我們直接(*s1)[0]=100會panic,報錯:index out of range

package main
import "fmt"
func test() {
	s1 := new([]int) //為slice分配記憶體,返回地址
	(*s1)[0] = 100
	fmt.Println(s1)
	return
}
func main() {
	test()
}

如果我們要用這個slice,我們還需將其初始化,程式碼如下。我們用make對這個slice進行初始化,再賦值(*s1)[0]=100就可成功執行,結果如後圖所示。

package main
import "fmt"
func test() {
	s1 := new([]int) //為slice分配記憶體,返回地址
	fmt.Println(s1)
	s2 := make([]int, 10) //為slice分配記憶體,返回值型別
	*s1 = make([]int, 5)
	(*s1)[0] = 100
	s2[0] = 100
	fmt.Println(s1)
	return
}
func main() {
	test()
}

二. 為變數和自定義型別分配記憶體空間

2.1為變數分配

package main
import "fmt"
func main() {
	var sum *int = new(int)    //new分配空間
	fmt.Println(*sum)
	*sum = 98                  
	fmt.Println(*sum)
}

2.2 為自定義型別分配記憶體,如果我們不分配記憶體,就會panic。

package main
import "fmt"
func main() {
	type Student struct {
		name string
		age  int
	}
	var s *Student
	s = new(Student) //分配空間
	s.name = "dequan"
	fmt.Println(s)
}

make

make 也是用於記憶體分配的,但是和 new 不同,它只用於 chan、map 以及 slice 的記憶體建立,而且它返回的型別就是這三個型別本身,而不是他們的指標型別

我們可以通過如下程式碼和輸出結果對比觀察他們區別。

package main
import "fmt"
func test() {
	s1 := new([]int) //為slice分配記憶體,返回地址
	fmt.Println(s1)
	s2 := make([]int, 10) //為slice分配記憶體,返回值型別
	fmt.Println(s2)
	*s1 = make([]int, 5)
	(*s1)[0] = 100
	s2[0] = 100
	fmt.Println(s1)
	fmt.Println(s2)
	return
}
func main() {
	test()
}