Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bincangkan tentang perbezaan antara kata kunci baharu dan buat dalam bahasa Go

Mari kita bincangkan tentang perbezaan antara kata kunci baharu dan buat dalam bahasa Go

PHPz
PHPzke hadapan
2023-03-27 16:16:17827semak imbas

Artikel ini akan memperkenalkan soalan wawancara yang sangat biasa. Ini mungkin titik permulaan untuk banyak wawancara. Itulah perbezaan antara dua fungsi terbina dalam yang baharu dan buatan.

Mari kita bincangkan tentang perbezaan antara kata kunci baharu dan buat dalam bahasa Go

Sebenarnya, masalah itu sendiri tidak rumit, baru hanya memperuntukkan memori, manakala make hanya boleh digunakan untuk memulakan slice, map dan chan di bawah kami akan Mari perkenalkan secara terperinci.

baharu

baharu ialah fungsi terbina dalam yang memperuntukkan memori dan mengembalikan penuding ke memori tersebut.

Tandatangan fungsi adalah seperti berikut:

Kod sumber

// 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

Seperti yang dapat dilihat daripada kod di atas, fungsi baharu hanya menerima satu parameter, parameter ini adalah jenis dan mengembalikan penunjuk ke alamat memori jenis itu.

Pada masa yang sama, fungsi baharu akan menetapkan memori yang diperuntukkan kepada sifar, iaitu nilai sifar jenis.

Gunakan

untuk memperuntukkan ruang memori untuk pembolehubah menggunakan fungsi baharu:

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

Kod di atas adalah bersamaan, new(int) akan memperuntukkan Ruang dimulakan kepada nilai sifar int, iaitu, 0, dan penunjuk kepada int dikembalikan Ini mempunyai kesan yang sama seperti mengisytiharkan penunjuk secara langsung dan memulakannya.

Sudah tentu, fungsi baharu bukan sahaja boleh memperuntukkan ruang untuk jenis data lalai sistem, tetapi jenis tersuai juga boleh menggunakan fungsi baharu untuk memperuntukkan ruang, seperti yang ditunjukkan di bawah:

type Student struct {
   name string
   age int
}
var s *Student
s = new(Student) //分配空间
s.name = "zhangsan"
fmt.Println(s)

Ini ialah fungsi baharu , ia sentiasa mengembalikan penunjuk jenis dan penunjuk menunjuk ke alamat memori jenis yang diperuntukkan. Perlu diingatkan bahawa fungsi baru hanya akan memperuntukkan ruang memori, tetapi tidak akan memulakan ruang memori.

make

make juga digunakan untuk peruntukan memori, tetapi tidak seperti baru, ia hanya digunakan untuk penciptaan memori slice, map dan chan, dan jenis yang dikembalikan Ia adalah tiga jenis itu sendiri, bukan jenis penunjuk mereka. Oleh kerana ketiga-tiga jenis ini adalah jenis rujukan sendiri, tidak perlu mengembalikan penunjuknya.

Tandatangan fungsi adalah seperti berikut:

Kod sumber

// 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

Ia boleh dilihat daripada kod di atas bahawa parameter t fungsi make mestilah slice , map dan chan, dan nilai pulangan juga adalah jenis itu sendiri.

Gunakan

Yang berikut menggunakan slice untuk memberikan contoh:

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}
}

Nilai sifar bagi slice ialah nil, tetapi selepas pemulaan menggunakan make , kandungan hirisan diisi dengan nilai sifar jenis int, seperti: []int{0, 0, 0}.

peta dan chan juga serupa, jadi saya tidak akan menerangkan secara terperinci.

Ringkasan

Melalui analisis di atas, perbezaan utama antara baru dan buatan diringkaskan seperti berikut:

  • buat boleh hanya digunakan untuk pengedaran dan data yang dimulakan bagi jenis slice, map dan chan. new boleh memperuntukkan apa-apa jenis data; make mengembalikan jenis itu sendiri, iaitu

    ; ruang yang diperuntukkan oleh
  • *Typebaharu dikosongkan. Selepas memperuntukkan ruang, ia akan dimulakan; Type

  • Pembelajaran yang disyorkan: "

    pergi tutorial video

    "

Atas ialah kandungan terperinci Mari kita bincangkan tentang perbezaan antara kata kunci baharu dan buat dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam