在Go语言中可以使用var来声明一个变量,并指明变量的数据类型。通过var声明(包括结构体),系统会默认为他分配内存空间,并赋该类型的零值。声明一个指针类型的变量,系统不会为他分配内存,默认是nil。
new 和 make 都是用来内存分配的,make只能用于内建类型(map、slice、channel)的内存分配和初始化。new只分配内存,可以是任意的数据类型。
从返回值上来说make返回的是引用类型本身,而new返回的是类型的指针。
注意:
常见类型明确的场合下,使用短变量声明方式:=。
make 只能用来分配及初始化类型为 slice、map、chan 的数据。new 可以分配任意类型的数据。
new 分配返回的是指针,即类型 *Type。make 返回引用,即 Type。
new 分配的空间被清零。make 分配空间后,会进行初始化。
避免使用new,除非你需要一个指针变量。
例子1:
package main
import "fmt"
func main() {
var p []string
b := []string{}
fmt.Println(p, b)
}
例子2:
package main
import (
"fmt"
)
type A struct {
Name string
}
func main() {
p := new(A)
p.Name = "ywfuns.com"
fmt.Println(p)
}
使用new初始化一个struct,返回的是一个指针。
new 函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针。同时 new 函数会把分配的内存置为零,也就是类型的零值。
例子3:
package main
import "fmt"
func main() {
p := make([]int,0)
b :=[]int{}
fmt.Println(p, b)
}
make返回的类型就是类型本身,而不是他们的指针类型,因为是引用类型,所以就没有必要返回他们的指针了。