0Pricing
Go Academy · บทเรียน

รูปแบบคอนสตรักเตอร์

สร้างคอนสตรักเตอร์ Go ตามแนวทางที่เหมาะสมกับภาษา

รูปแบบคอนสตรักเตอร์ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องมีตัวสร้าง

Go ไม่มีคีย์เวิร์ด new สำหรับชนิดข้อมูล และไม่มีตัวสร้างคลาส ตามแนวทางปกติจะใช้ฟังก์ชันชื่อ New... เพื่อตรวจสอบอินพุต แล้วส่งคืนค่าหรือพอยน์เตอร์ที่กำหนดค่าเริ่มต้นแล้ว

ฟังก์ชัน New แบบง่าย

ส่งคืนพอยน์เตอร์เพื่อให้ผู้เรียกทำงานกับอินสแตนซ์ร่วมกัน:

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

การตรวจสอบในตัวสร้าง

ตัวสร้างเหมาะสำหรับใช้ตรวจสอบอินพุตและส่งคืนข้อผิดพลาด:

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

รูปแบบตัวเลือกแบบฟังก์ชัน

รูปแบบตัวเลือกแบบฟังก์ชันช่วยให้กำหนดค่าที่เป็นตัวเลือกได้โดยไม่ทำให้ส่วนติดต่อการใช้งานเดิมเสียหาย:

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

รูปแบบตัวสร้าง

สำหรับออบเจ็กต์ที่ซับซ้อน รูปแบบตัวสร้างจะเชื่อมเมธอดตัวตั้งค่าและส่งคืนผลลัพธ์:

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

การส่งคืนค่าเทียบกับพอยน์เตอร์

ส่งคืนค่าเมื่อสตรักต์มีขนาดเล็กและไม่เปลี่ยนแปลง ส่วนการส่งคืนพอยน์เตอร์เหมาะเมื่อสตรักต์มีขนาดใหญ่ เปลี่ยนแปลงได้ หรือใช้งานอินเทอร์เฟซ:

  • สตรักต์การกำหนดค่าขนาดเล็ก → ค่า
  • ออบเจ็กต์ที่มีสถานะ (เซิร์ฟเวอร์ ไคลเอ็นต์ พูล) → พอยน์เตอร์
  • หากใช้งานอินเทอร์เฟซด้วยรีซีฟเวอร์แบบพอยน์เตอร์ → พอยน์เตอร์

รูปแบบการกำหนดค่าเริ่มต้น

ใช้ฟังก์ชันกำหนดค่าเริ่มต้นหรือลิเทอรัลของสตรักต์เพื่อกำหนดค่าเริ่มต้นที่เหมาะสมก่อนใช้ตัวเลือก:

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
}

รูปแบบอินสแตนซ์เดียว

ใช้ sync.Once เพื่อเริ่มต้นทรัพยากรที่ใช้ร่วมกันให้เกิดขึ้นเพียงครั้งเดียว:

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
}

การทดสอบตัวสร้าง

ตัวสร้างที่ส่งคืนข้อผิดพลาดสามารถทดสอบได้ง่าย:

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
}

หลีกเลี่ยง init()

ฟังก์ชัน init() จะทำงานโดยอัตโนมัติและทดสอบได้ยาก ควรใช้ตัวสร้างที่เรียกใช้อย่างชัดเจนและส่งคืนข้อผิดพลาด แทนการเริ่มต้นโดยปริยายภายใน init()

ตรวจสอบความเข้าใจอย่างรวดเร็ว

รูปแบบตัวเลือกแบบฟังก์ชันช่วยให้บรรลุอะไร

สรุป: รูปแบบตัวสร้าง

ประเด็นสำคัญ:

  • ใช้ฟังก์ชัน New... เป็นตัวสร้าง
  • ส่งคืนข้อผิดพลาดเมื่อการตรวจสอบไม่ผ่าน
  • ใช้ตัวเลือกแบบฟังก์ชันเพื่อกำหนดค่าที่เป็นตัวเลือกได้อย่างยืดหยุ่น
  • ใช้รูปแบบตัวสร้างกับออบเจ็กต์คำขอหรือการกำหนดค่าที่ซับซ้อน
  • เลือกใช้ตัวสร้างที่เรียกใช้อย่างชัดเจนแทน init()

โจทย์ฝึกปฏิบัติ

สร้างตัวสร้าง NewHTTPClient โดยใช้ตัวเลือกแบบฟังก์ชัน รองรับตัวเลือก WithTimeout, WithBaseURL และ WithMaxRetries

คำถามที่พบบ่อย

บทเรียน “รูปแบบคอนสตรักเตอร์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบคอนสตรักเตอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบคอนสตรักเตอร์”

สร้างคอนสตรักเตอร์ Go ตามแนวทางที่เหมาะสมกับภาษา คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบคอนสตรักเตอร์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดและใช้งานสตรักต์
  2. เมธอดบนสตรักต์
  3. รูปแบบคอนสตรักเตอร์
  4. สตรักต์ไม่ระบุชื่อและการประกอบ
← กลับไปที่ Go Academy