Fungsi new()
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 22 dari 107.
Go menyediakan fungsi bawaan bernama new() yang mengalokasikan memori untuk suatu tipe dan mengembalikan pointer ke tipe tersebut. Memori yang dialokasikan diinisialisasi dengan nilai nol tipe tersebut.
p := new(int) // mengalokasikan memori untuk int
fmt.Println(*p) // 0 (nilai nol)
fmt.Println(p) // 0xc000018030 (alamat memori)Fungsi new() menerima tipe sebagai argumennya dan mengembalikan pointer ke nilai nol baru yang dialokasikan dengan tipe tersebut. Ini sangat berguna saat kamu memerlukan pointer, tetapi tidak memiliki variabel yang sudah ada untuk dirujuk.
Dengan struct, new() membuat pointer ke struct dengan semua field diatur ke nilai nolnya.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (string kosong)
fmt.Println(p.Age) // 0Kamu mungkin bertanya-tanya kapan harus menggunakan new() dibandingkan operator alamat &. Kedua pendekatan di bawah ini setara:
// Menggunakan new()
p1 := new(Person)
// Menggunakan operator alamat dengan literal
p2 := &Person{}Sintaks &Person{} lebih umum digunakan karena memungkinkan kamu menginisialisasi field sekaligus. Gunakan new() jika kamu secara khusus menginginkan instance dengan nilai nol dan lebih memilih semantik alokasi memori yang eksplisit.
Tantangan
MudahMari buat pengelola konfigurasi yang menunjukkan cara new() mengalokasikan memori dan menginisialisasi struct dengan nilai nolnya. Kamu akan melihat perbedaan pendekatan ini dengan penggunaan operator alamat bersama literal struct.
Kamu akan menyusun kodemu dalam dua file:
config.go: Definisikan structServerConfigdengan fieldHost(string),Port(int),MaxConnections(int), danDebugMode(bool). Buat dua fungsi:NewServerConfigyang menggunakannew()untuk mengalokasikanServerConfigdan langsung mengembalikan pointer (dengan semua nilai nol)ConfigureServeryang menerima pointer*ServerConfigbersama string host dan integer port, lalu menetapkan field tersebut pada konfigurasi melalui pointer
Displaypada*ServerConfigyang mengembalikan string berformat dan menampilkan semua nilai konfigurasi.main.go: Baca host dan port dari input. Pertama, buat konfigurasi menggunakanNewServerConfig()dan tampilkan untuk menunjukkan nilai nol. Lalu gunakanConfigureServeruntuk menetapkan host dan port, kemudian tampilkan konfigurasi lagi untuk menunjukkan nilai yang telah diperbarui.
Input berikut akan diberikan:
- Baris 1: Nama host (string)
- Baris 2: Nomor port (integer)
Method Display-mu harus mengembalikan string dengan format persis seperti ini:
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]Cetak output tampilan dua kali, sekali sebelum konfigurasi (menampilkan nilai nol) dan sekali setelah konfigurasi (menampilkan host dan port yang telah diperbarui).
Misalnya, jika diberikan localhost dan 8080, outputmu seharusnya:
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: falsePerhatikan bahwa tampilan pertama menunjukkan semua nilai nol (string kosong, 0, 0, false) karena new() menginisialisasi semuanya dengan nilai nol. Setelah memanggil ConfigureServer, hanya host dan port yang berubah, sementara field lainnya tetap memiliki nilai nol.
Coba sendiri
package main
import (
"fmt"
)
func main() {
// Baca input
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: Buat konfigurasi dengan NewServerConfig() lalu tampilkan
// Ini akan menampilkan nilai nol
// TODO: Gunakan ConfigureServer untuk mengatur host dan port
// TODO: Tampilkan lagi konfigurasi untuk melihat nilai yang sudah diperbarui
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online