Go Academy · Pelajaran

new() dan Bila Perlu Menggunakan Penuding

Peruntukan dengan new dan corak penuding umum

Pelajaran 4 daripada 413 langkah

new() dan Bila Perlu Menggunakan Penuding ialah pelajaran Go Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Go Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Fungsi Terbina Dalam new()

new(T) memperuntukkan T yang diisi nilai sifar dan memulangkan *T. Untuk struktur, ia setara dengan &T{}:

package main
import "fmt"

func main() {
    p := new(int)
    fmt.Println(*p)     // 0
    *p = 42
    fmt.Println(*p)     // 42

    type Point struct{ X, Y int }
    pt := new(Point)
    fmt.Println(*pt)    // {0 0}
}

new berbanding &T{}

Untuk struktur, &T{} lebih idiomatik dan membenarkan pemulaan medan. new jarang digunakan dalam Go moden:

package main
import "fmt"

type Config struct{ Port int; Host string }

func main() {
    a := new(Config)          // zeroed
    b := &Config{Port: 8080}  // initialized
    fmt.Println(a, b)
}

Bila Hendak Memulangkan Penuding

Mulangkan penuding daripada pembina apabila:

  • Struktur mempunyai keadaan dan pemanggil mesti berkongsi tika yang sama
  • Struktur mempunyai kaedah penerima penuding (diperlukan untuk pemenuhan antara muka)
  • Struktur adalah besar dan penyalinan akan menjadi mahal

Bila Hendak Memulangkan Nilai

Mulangkan nilai apabila:

  • Jenis itu kecil (beberapa medan)
  • Ia ialah konfigurasi yang tidak boleh diubah
  • Anda mahu menjelaskan bahawa pemanggil menerima salinan bebas

Contoh: time.Time dipulangkan mengikut nilai walaupun mempunyai banyak kaedah.

Penuding dalam Kepingan dan Peta

Menyimpan penuding dalam koleksi membolehkan pengubahan dikongsi:

package main
import "fmt"

type User struct{ Name string; Score int }

func main() {
    users := []*User{{"Alice", 0}, {"Bob", 0}}
    users[0].Score = 100
    fmt.Println(users[0]) // &{Alice 100}
}

Penuding kepada Primitif untuk Pilihan

Medan *int atau *string boleh menjadi nil untuk bermaksud "tidak ditetapkan", yang berguna untuk JSON dengan omitempty atau lajur pangkalan data pilihan:

package main
import "fmt"

type Profile struct {
    Name string
    Age  *int // nil means not provided
}

func main() {
    p := Profile{Name: "Alice"}
    fmt.Println(p.Age == nil) // true
    age := 30
    p.Age = &age
    fmt.Println(*p.Age) // 30
}

Mengelakkan Pertambahan Penuding

Penggunaan penuding yang berlebihan meningkatkan tekanan pada pengutip sampah dan mengurangkan kedekatan data dalam cache. Jalankan tanda aras sebelum menukar jenis nilai kepada penuding semata-mata demi prestasi.

make berbanding new

make memulakan kepingan, peta dan saluran (semuanya memerlukan persediaan dalaman). new memperuntukkan sebarang jenis dengan nilai sifar dan memulangkan penuding. Kedua-duanya mempunyai tujuan yang berbeza:

package main
import "fmt"

func main() {
    s := make([]int, 5)           // usable slice
    m := make(map[string]int)     // usable map
    p := new(int)                 // *int pointing to 0
    fmt.Println(s, m, *p)
}

Corak Penuding Tidak Boleh Diubah

Mulangkan *T tetapi dokumentasikan bahawa ia tidak boleh diubah; pengguna tidak sepatutnya mengubah suainya. Corak ini biasa digunakan pada objek konfigurasi yang dikongsi antara gorutin.

Ringkasan Keselamatan Penuding

Peraturan untuk kekal selamat dengan penuding:

  • Sentiasa semak nil sebelum menyahrujuk
  • Jangan simpan penuding kepada pemboleh ubah tindanan lebih lama daripada jangka hayat pemboleh ubah itu (analisis pelolosan Go mengendalikannya)
  • Jangan sekali-kali menukar jenis unsafe.Pointer melainkan benar-benar perlu
  • Biarkan pengkompil mengurus tindanan berbanding timbunan

Semakan Pantas

Apakah yang dipulangkan oleh new(int)?

Ringkasan: new dan Penuding

Perkara utama:

  • new(T) memulangkan *T dengan nilai sifar — jarang digunakan; utamakan &T{}
  • Mulangkan nilai apabila kecil atau tidak boleh diubah; gunakan penuding apabila berkeadaan atau besar
  • Medan *T membolehkan semantik nil-sebagai-tiada
  • Jangan gunakan penuding secara berlebihan — pengutip sampah mempunyai kos

Arahan Latihan

Cipta struktur Settings dengan medan *int untuk MaxConnections. Tulis fungsi yang menerima *Settings dan menetapkan nilai lalai hanya apabila medan itu ialah nil.

Percuma untuk bermula

Pelajari Go dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “new() dan Bila Perlu Menggunakan Penuding” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Go Academy, termasuk “new() dan Bila Perlu Menggunakan Penuding”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “new() dan Bila Perlu Menggunakan Penuding”?

Peruntukan dengan new dan corak penuding umum Anda berlatih Go Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Go Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Go Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “new() dan Bila Perlu Menggunakan Penuding” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Apakah Penuding?
  2. Penuding dan Fungsi
  3. Penerima Penuding pada Kaedah
  4. new() dan Bila Perlu Menggunakan Penuding
← Kembali ke Go Academy