รูปแบบคอนสตรักเตอร์
สร้างคอนสตรักเตอร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดและใช้งานสตรักต์
- เมธอดบนสตรักต์
- รูปแบบคอนสตรักเตอร์
- สตรักต์ไม่ระบุชื่อและการประกอบ