>  기사  >  백엔드 개발  >  Go 언어에서 new 키워드와 make 키워드의 차이점에 대해 이야기해 보겠습니다.

Go 언어에서 new 키워드와 make 키워드의 차이점에 대해 이야기해 보겠습니다.

PHPz
PHPz앞으로
2023-03-27 16:16:17823검색

이 기사에서는 매우 일반적인 면접 질문을 소개합니다. 얼마나 흔한가요? 이것이 많은 인터뷰의 출발점이 될 수 있습니다. 이것이 new와 make의 두 가지 내장 함수의 차이점입니다.

Go 언어에서 new 키워드와 make 키워드의 차이점에 대해 이야기해 보겠습니다.

사실 문제 자체는 복잡하지 않습니다. 간단히 말해서 new는 메모리만 할당하는 반면, make는 슬라이스, 맵, 찬 초기화에만 사용할 수 있습니다.

new

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

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

    물론 새 함수는 시스템의 기본 데이터 유형에 공간을 할당할 수 있을 뿐만 아니라 사용자 정의 유형도 새 함수를 사용하여 아래와 같이 공간을 할당할 수 있습니다.
  • rrreee
  • 이것은 새 함수이며 항상 포인터를 반환합니다. 포인터는 할당된 유형의 메모리 주소를 가리킵니다. 새 함수는 메모리 공간만 할당할 뿐 메모리 공간을 초기화하지는 않는다는 점에 유의해야 합니다.

    make

make도 메모리 할당에 사용되는데 new와는 달리 Slice, Map, chan의 메모리 생성에만 사용되며 반환하는 타입은 다음과 같습니다. 포인터 유형이 아닌 세 가지 유형 자체입니다. 이 세 가지 유형은 자체가 참조 유형이므로 해당 포인터를 반환할 필요가 없습니다. 함수 시그니처는 다음과 같습니다.

🎜소스 코드🎜🎜rrreee🎜위 코드에서 t 매개변수를 볼 수 있습니다. make 함수는 슬라이스 또는 맵과 chan이어야 하며 반환 값도 유형 자체입니다. 🎜

🎜사용 🎜🎜🎜다음은 슬라이스를 사용하여 예를 보여줍니다. 🎜rrreee🎜슬라이스의 0 값은 nil이지만 make를 사용하여 초기화한 후 , 슬라이스 콘텐츠는 []int{0, 0, 0}와 같이 int 유형의 0개 값으로 채워집니다. 🎜🎜map과 chan도 비슷해서 자세한 내용은 다루지 않겠습니다. 🎜

🎜Summary🎜🎜🎜위의 분석을 통해 new와 make의 주요 차이점을 정리하면 다음과 같습니다. 🎜
    🎜🎜make 슬라이스, 맵, 챈 유형의 데이터를 할당하고 초기화하는 데에만 사용할 수 있습니다. new는 모든 유형의 데이터를 할당할 수 있습니다. 🎜🎜🎜🎜new 할당은 포인터, 즉 *Type 유형을 반환합니다. make는 유형 자체를 반환합니다(예: Type). 🎜🎜🎜🎜new 할당된 공간이 지워집니다. make가 공간을 할당한 후에는 초기화됩니다. 🎜🎜🎜🎜추천 학습: "🎜go 비디오 튜토리얼🎜"🎜

위 내용은 Go 언어에서 new 키워드와 make 키워드의 차이점에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제