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

PHPz
풀어 주다: 2023-03-27 17:16:36
앞으로
757명이 탐색했습니다.

이 기사에서는 매우 일반적인 면접 질문을 소개합니다. 얼마나 흔한가요? 이것이 많은 인터뷰의 출발점이 될 수 있습니다. 이것이 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으로 문의하세요.
최신 이슈
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!