0Pricing
Go Academy · Pelajaran

Pola Konstruktor

Membangun konstruktor Go yang idiomatis

Pola Konstruktor adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Mengapa Konstruktor

Go tidak memiliki kata kunci new untuk tipe dan tidak memiliki konstruktor kelas. Konvensinya adalah fungsi bernama New... yang memvalidasi input dan mengembalikan nilai atau penunjuk yang telah diinisialisasi.

Fungsi New Sederhana

Kembalikan penunjuk untuk memastikan pemanggil bekerja dengan satu instans bersama:

package main
import "fmt"

type Server struct {
    Host string
    Port int
}

func NewServer(host string, port int) *Server {
    return &Server{Host: host, Port: port}
}

func main() {
    s := NewServer("localhost", 8080)
    fmt.Println(s.Host, s.Port)
}

Validasi dalam Konstruktor

Konstruktor adalah tempat yang baik untuk memvalidasi input dan mengembalikan kesalahan:

package main
import ("errors"; "fmt")

type Config struct{ Workers int }

func NewConfig(workers int) (*Config, error) {
    if workers < 1 {
        return nil, errors.New("workers must be >= 1")
    }
    return &Config{Workers: workers}, nil
}

func main() {
    c, err := NewConfig(4)
    fmt.Println(c, err)
}

Pola Opsi Fungsional

Pola opsi fungsional memungkinkan konfigurasi opsional tanpa merusak API:

package main
import "fmt"

type Server struct{ host string; port int; timeout int }
type Option func(*Server)

func WithPort(p int) Option    { return func(s *Server) { s.port = p } }
func WithTimeout(t int) Option { return func(s *Server) { s.timeout = t } }

func NewServer(host string, opts ...Option) *Server {
    s := &Server{host: host, port: 8080, timeout: 30}
    for _, o := range opts { o(s) }
    return s
}

func main() {
    s := NewServer("localhost", WithPort(9090), WithTimeout(60))
    fmt.Println(s.port, s.timeout)
}

Pola Pembangun

Untuk objek kompleks, pola pembangun merangkai metode penyetel dan mengembalikan hasilnya:

package main
import "fmt"

type QueryBuilder struct{ table, where string; limit int }

func (q *QueryBuilder) Table(t string) *QueryBuilder { q.table = t; return q }
func (q *QueryBuilder) Where(w string) *QueryBuilder { q.where = w; return q }
func (q *QueryBuilder) Limit(n int)   *QueryBuilder { q.limit = n; return q }
func (q *QueryBuilder) Build() string {
    return fmt.Sprintf("SELECT * FROM %s WHERE %s LIMIT %d", q.table, q.where, q.limit)
}

func main() {
    sql := (&QueryBuilder{}).Table("users").Where("age>18").Limit(10).Build()
    fmt.Println(sql)
}

Mengembalikan Nilai atau Penunjuk

Kembalikan nilai saat struktur kecil dan tidak dapat diubah; kembalikan penunjuk saat struktur besar, dapat diubah, atau mengimplementasikan antarmuka:

  • Struktur konfigurasi kecil → nilai
  • Objek berkeadaan (server, klien, kumpulan) → penunjuk
  • Jika mengimplementasikan antarmuka dengan penerima penunjuk → penunjuk

Pola Nilai Bawaan

Gunakan fungsi nilai bawaan atau literal struktur untuk menetapkan nilai bawaan yang sesuai sebelum menerapkan opsi:

package main
import "fmt"

type Cache struct{ maxSize int; ttlSecs int }

func defaultCache() Cache { return Cache{maxSize: 100, ttlSecs: 300} }

func NewCache(opts ...func(*Cache)) *Cache {
    c := defaultCache()
    for _, o := range opts { o(&c) }
    return &c
}

func main() {
    c := NewCache(func(c *Cache) { c.maxSize = 500 })
    fmt.Println(c.maxSize, c.ttlSecs) // 500 300
}

Pola Instans Tunggal

Gunakan sync.Once untuk menginisialisasi sumber daya bersama tepat satu kali:

package main
import ("fmt"; "sync")

type DB struct{ DSN string }

var (
    instance *DB
    once     sync.Once
)

func GetDB(dsn string) *DB {
    once.Do(func() { instance = &DB{DSN: dsn} })
    return instance
}

func main() {
    db1 := GetDB("postgres://...")
    db2 := GetDB("ignored")
    fmt.Println(db1 == db2) // true
}

Menguji Konstruktor

Konstruktor yang mengembalikan kesalahan mudah diuji:

package main
import ("errors"; "fmt")

type Pool struct{ size int }

func NewPool(size int) (*Pool, error) {
    if size <= 0 { return nil, errors.New("size must be positive") }
    return &Pool{size: size}, nil
}

func main() {
    _, err := NewPool(-1)
    fmt.Println(err) // size must be positive
    p, _ := NewPool(5)
    fmt.Println(p.size) // 5
}

Hindari init()

Fungsi init() berjalan secara otomatis dan sulit diuji. Utamakan konstruktor eksplisit yang mengembalikan kesalahan daripada inisialisasi implisit dalam init().

Pemeriksaan Singkat

Apa yang dicapai pola opsi fungsional?

Ringkasan: Pola Konstruktor

Hal-hal penting:

  • Gunakan fungsi New... sebagai konstruktor
  • Kembalikan kesalahan untuk kegagalan validasi
  • Gunakan opsi fungsional untuk konfigurasi opsional yang fleksibel
  • Gunakan pola pembangun untuk objek kueri atau konfigurasi yang kompleks
  • Utamakan konstruktor eksplisit daripada init()

Latihan

Implementasikan konstruktor NewHTTPClient menggunakan opsi fungsional. Dukung opsi WithTimeout, WithBaseURL, dan WithMaxRetries.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pola Konstruktor” gratis?

Ya — teks lengkap “Pola Konstruktor” 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 “Pola Konstruktor”?

Membangun konstruktor Go yang idiomatis 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 3 dari 4.

Berapa lama pelajaran “Pola Konstruktor” 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. Mendefinisikan dan Menggunakan Struct
  2. Metode pada Struct
  3. Pola Konstruktor
  4. Struct Anonim dan Komposisi
← Kembali ke Go Academy