Teka-teki Peruntukan: new() lwn Penunjuk "Biasa" dalam Go
Dalam bidang pengaturcaraan Go, timbul persoalan: adakah terdapat perbezaan ketara antara dua segmen kod berikut apabila memperuntukkan memori untuk objek baharu?
Segmen Kod 1:
v := &Vector{}
Kod Segmen 2:
v := new(Vector)
Jawapan:
Anehnya, ada tiada perbezaan ketara antara kedua-dua segmen kod. Kedua-duanya mencapai hasil yang sama: mencipta penuding kepada contoh baharu jenis Vektor.
Penjelasan Terperinci:
Apabila memanggil baharu(Vektor), kata kunci baharu memperuntukkan memori untuk objek Vektor baharu dan mengembalikan penunjuk kepada objek itu. Begitu juga, &Vector{} juga memperuntukkan memori untuk objek Vektor baharu dan mengembalikan penunjuk kepadanya.
Untuk menggambarkan, pertimbangkan kod berikut:
package main import "fmt" import "reflect" type Vector struct { x int y int } func main() { v := &Vector{} x := new(Vector) fmt.Println(reflect.TypeOf(v)) fmt.Println(reflect.TypeOf(x)) }
Output:
*main.Vector *main.Vector
Seperti yang anda lihat, kedua-dua v dan x adalah penunjuk kepada objek Vektor. Mereka mempunyai jenis yang sama.
Kes Penggunaan:
Walaupun kedua-dua segmen kod mencapai hasil yang sama, sesetengah pembangun berpendapat bahawa baharu adalah lebih sesuai apabila memori yang diperuntukkan akan serta-merta dinyahrujuk dan digunakan, kerana ia membantu mengelakkan ralat rujuk dua kali. Contohnya:
// Allocates memory and immediately dereferences it v := new(Vector).x
Kesimpulan:
Kesimpulannya, pilihan antara menggunakan baharu dan sintaks peruntukan "biasa" dalam Go semata-mata bergantung kepada keutamaan peribadi. Kedua-dua kaedah memperuntukkan memori dan mengembalikan penunjuk kepada objek yang baru dibuat, menawarkan kefungsian yang sama.
Atas ialah kandungan terperinci Pergi Peruntukan Memori: `new()` vs `&{}` – Apakah Perbezaan Sebenar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!