이 기사에서는 매우 일반적인 면접 질문을 소개합니다. 얼마나 흔한가요? 이것이 많은 인터뷰의 출발점이 될 수 있습니다. 이것이 new와 make의 두 가지 내장 함수의 차이점입니다.
사실 문제 자체는 복잡하지 않습니다. 간단히 말해서 new는 메모리만 할당하는 반면, make는 슬라이스, 맵, 찬 초기화에만 사용할 수 있습니다.
new는 메모리를 할당하고 해당 메모리에 대한 포인터를 반환하는 내장 함수입니다.
함수 서명은 다음과 같습니다.
// The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that type. func new(Type) *Type
위 코드에서 볼 수 있듯이 새 함수는 유형인 하나의 매개 변수만 허용하고 해당 메모리 주소에 대한 포인터를 반환합니다. 유형.
동시에 새 함수는 할당된 메모리를 유형의 0 값인 0으로 설정합니다.
새 함수를 사용하여 변수에 대한 메모리 공간을 할당합니다:
p1 := new(int) fmt.Printf("p1 --> %#v \n ", p1) //(*int)(0xc42000e250) fmt.Printf("p1 point to --> %#v \n ", *p1) //0 var p2 *int i := 0 p2 = &i fmt.Printf("p2 --> %#v \n ", p2) //(*int)(0xc42000e278) fmt.Printf("p2 point to --> %#v \n ", *p2) //0
위 코드는 동일합니다. new(int)
는 할당된 공간을 int의 0 값으로 초기화합니다. 0이고 int에 대한 포인터를 반환합니다. 이는 포인터를 직접 선언하고 초기화하는 것과 동일한 효과를 갖습니다. new(int)
将分配的空间初始化为 int 的零值,也就是 0,并返回 int 的指针,这和直接声明指针并初始化的效果是相同的。
当然,new 函数不仅能够为系统默认的数据类型分配空间,自定义类型也可以使用 new 函数来分配空间,如下所示:
type Student struct { name string age int } var s *Student s = new(Student) //分配空间 s.name = "zhangsan" fmt.Println(s)
这就是 new 函数,它返回的永远是类型的指针,指针指向分配类型的内存地址。需要注意的是,new 函数只会分配内存空间,但并不会初始化该内存空间。
make 也是用于内存分配的,但是和 new 不同,它只用于 slice、map 和 chan 的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型。因为这三种类型本身就是引用类型,所以就没有必要返回他们的指针了。
其函数签名如下:
// The make built-in function allocates and initializes an object of type // slice, map, or chan (only). Like new, the first argument is a type, not a // value. Unlike new, make's return type is the same as the type of its // argument, not a pointer to it. The specification of the result depends on // the type: // Slice: The size specifies the length. The capacity of the slice is // equal to its length. A second integer argument may be provided to // specify a different capacity; it must be no smaller than the // length, so make([]int, 0, 10) allocates a slice of length 0 and // capacity 10. // Map: An empty map is allocated with enough space to hold the // specified number of elements. The size may be omitted, in which case // a small starting size is allocated. // Channel: The channel's buffer is initialized with the specified // buffer capacity. If zero, or the size is omitted, the channel is // unbuffered. func make(t Type, size ...IntegerType) Type
通过上面的代码可以看出 make 函数的 t
参数必须是 slice、map 和 chan 中的一个,并且返回值也是类型本身。
下面用 slice 来举一个例子:
var s1 []int if s1 == nil { fmt.Printf("s1 is nil --> %#v \n ", s1) // []int(nil) } s2 := make([]int, 3) if s2 == nil { fmt.Printf("s2 is nil --> %#v \n ", s2) } else { fmt.Printf("s2 is not nill --> %#v \n ", s2)// []int{0, 0, 0} }
slice 的零值是 nil
,但使用 make 初始化之后,slice 内容被类型 int 的零值填充,如:[]int{0, 0, 0}
。
map 和 chan 也是类似的,就不多说了。
通过以上分析,总结一下 new 和 make 主要区别如下:
make 只能用来分配及初始化类型为 slice、map 和 chan 的数据。new 可以分配任意类型的数据;
new 分配返回的是指针,即类型 *Type
。make 返回类型本身,即 Type
make도 메모리 할당에 사용되는데 new와는 달리 Slice, Map, chan의 메모리 생성에만 사용되며 반환하는 타입은 다음과 같습니다. 포인터 유형이 아닌 세 가지 유형 자체입니다. 이 세 가지 유형은 자체가 참조 유형이므로 해당 포인터를 반환할 필요가 없습니다. 함수 시그니처는 다음과 같습니다.
t
매개변수를 볼 수 있습니다. make 함수는 슬라이스 또는 맵과 chan이어야 하며 반환 값도 유형 자체입니다. 🎜nil
이지만 make를 사용하여 초기화한 후 , 슬라이스 콘텐츠는 []int{0, 0, 0}
와 같이 int 유형의 0개 값으로 채워집니다. 🎜🎜map과 chan도 비슷해서 자세한 내용은 다루지 않겠습니다. 🎜*Type
유형을 반환합니다. make는 유형 자체를 반환합니다(예: Type
). 🎜🎜🎜🎜new 할당된 공간이 지워집니다. make가 공간을 할당한 후에는 초기화됩니다. 🎜🎜🎜🎜추천 학습: "🎜go 비디오 튜토리얼🎜"🎜위 내용은 Go 언어에서 new 키워드와 make 키워드의 차이점에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!