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*Tyang diisi nol — jarang digunakan; utamakan&T{}- Kembalikan nilai jika berukuran kecil atau tidak dapat diubah; gunakan penunjuk jika memiliki keadaan atau berukuran besar
- Bidang
*Tmemungkinkan 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
- Apa Itu Pointer?
- Pointer dan Fungsi
- Receiver Pointer pada Metode
- new() dan Kapan Menggunakan Pointer