0Pricing
Go Academy · Pelajaran

new() dan Kapan Menggunakan Pointer

Alokasi dengan new dan pola pointer umum

new() dan Kapan Menggunakan Pointer adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Fungsi Bawaan new()

new(T) mengalokasikan T yang diisi nol dan mengembalikan *T. Untuk struktur, ini 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 dibandingkan &T{}

Untuk struktur, &T{} lebih idiomatis dan memungkinkan inisialisasi bidang. new jarang digunakan dalam Go modern:

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

Kapan Mengembalikan Penunjuk

Kembalikan penunjuk dari konstruktor ketika:

  • Struktur memiliki keadaan dan pemanggil harus berbagi instans yang sama
  • Struktur memiliki metode dengan penerima penunjuk (diperlukan untuk pemenuhan antarmuka)
  • Struktur berukuran besar dan penyalinannya mahal

Kapan Mengembalikan Nilai

Kembalikan nilai ketika:

  • Tipe berukuran kecil (beberapa bidang)
  • Tipe tersebut merupakan konfigurasi yang tidak dapat diubah
  • Anda ingin memperjelas bahwa pemanggil memperoleh salinan yang independen

Contoh: time.Time dikembalikan berdasarkan nilai meskipun memiliki banyak metode.

Penunjuk dalam Slice dan Peta

Menyimpan penunjuk dalam koleksi memungkinkan perubahan dibagikan:

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

Penunjuk ke Tipe Primitif untuk Nilai Opsional

Bidang *int atau *string dapat bernilai nil untuk menyatakan "belum diatur", yang berguna untuk JSON dengan omitempty atau kolom basis data opsional:

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
}

Menghindari Perbanyakan Penunjuk

Penggunaan penunjuk yang berlebihan meningkatkan tekanan pada GC dan mengurangi lokalitas cache. Lakukan tolok ukur sebelum mengubah tipe nilai menjadi penunjuk hanya demi kinerja.

make dibandingkan new

make menginisialisasi slice, peta, dan kanal (semuanya memerlukan penyiapan internal). new mengalokasikan tipe apa pun dalam keadaan nol dan mengembalikan penunjuk. Keduanya memiliki tujuan yang berbeda:

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

Pola Penunjuk yang Tidak Dapat Diubah

Kembalikan *T tetapi dokumentasikan sebagai tidak dapat diubah; pengguna tidak boleh memodifikasinya. Pola ini umum pada objek konfigurasi yang dibagikan di antara goroutine.

Ringkasan Keamanan Penunjuk

Aturan untuk tetap aman saat menggunakan penunjuk:

  • Selalu periksa nil sebelum melakukan dereferensi
  • Jangan menyimpan penunjuk ke variabel tumpukan lebih lama daripada masa hidup variabel tersebut (analisis pelolosan Go menanganinya)
  • Jangan pernah melakukan casting unsafe.Pointer kecuali benar-benar diperlukan
  • Biarkan kompilator mengelola tumpukan dan heap

Pemeriksaan Singkat

Apa yang dikembalikan oleh new(int)?

Rangkuman: new dan Penunjuk

Hal-hal penting:

  • new(T) mengembalikan *T yang diisi nol — jarang digunakan; utamakan &T{}
  • Kembalikan nilai jika berukuran kecil atau tidak dapat diubah; gunakan penunjuk jika memiliki keadaan atau berukuran besar
  • Bidang *T memungkinkan semantik nil sebagai tanda tidak ada
  • Jangan menggunakan penunjuk secara berlebihan — GC memiliki biaya

Tugas Latihan

Buat struktur Settings dengan bidang *int untuk MaxConnections. Tulis fungsi yang menerima *Settings dan menetapkan nilai bawaan hanya ketika bidang tersebut bernilai nil.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “new() dan Kapan Menggunakan Pointer” gratis?

Ya — teks lengkap “new() dan Kapan Menggunakan Pointer” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “new() dan Kapan Menggunakan Pointer”?

Alokasi dengan new dan pola pointer umum Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “new() dan Kapan Menggunakan Pointer” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Apa Itu Pointer?
  2. Pointer dan Fungsi
  3. Receiver Pointer pada Metode
  4. new() dan Kapan Menggunakan Pointer
← Kembali ke Go Academy