นอกจาก Oleiade แล้วให้ดูที่spec ของค่าศูนย์ :
เมื่อมีการจัดสรรหน่วยความจำเพื่อเก็บค่าไม่ว่าจะเป็นการประกาศหรือการเรียกใช้การสร้างหรือการสร้างใหม่และไม่มีการกำหนดค่าเริ่มต้นอย่างชัดเจนหน่วยความจำจะได้รับการกำหนดค่าเริ่มต้น แต่ละองค์ประกอบของค่าดังกล่าวถูกตั้งค่าเป็นศูนย์ค่าสำหรับประเภท: false สำหรับ booleans, 0 สำหรับจำนวนเต็ม, 0.0 สำหรับโฟลต, "" สำหรับสตริงและไม่มีศูนย์สำหรับพอยน์เตอร์, ฟังก์ชัน, อินเทอร์เฟซ, ชิ้น, ช่องทางและแผนที่ การกำหนดค่าเริ่มต้นนี้จะเกิดขึ้นซ้ำ ๆ ดังนั้นเช่นแต่ละองค์ประกอบของอาร์เรย์ของ struct จะมีฟิลด์เป็นศูนย์ถ้าไม่มีการระบุค่า
อย่างที่คุณเห็นnil
ไม่ใช่ค่าศูนย์สำหรับทุกประเภท แต่สำหรับพอยน์เตอร์ฟังก์ชั่นอินเทอร์เฟซชิ้นส่วนช่องและแผนที่เท่านั้น นี่คือสาเหตุที่ทำให้config == nil
เกิดข้อผิดพลาดและ
&config == nil
ไม่ใช่
เพื่อตรวจสอบว่าโครงสร้างของคุณจะเตรียมคุณจะต้องตรวจสอบสมาชิกทุกคนสำหรับค่าเป็นศูนย์ตามลำดับ (เช่นhost == ""
, port == 0
ฯลฯ ) หรือมีข้อมูลส่วนตัวซึ่งกำหนดโดยวิธีการเริ่มต้นภายใน ตัวอย่าง:
type Config struct {
Host string
Port float64
setup bool
}
func NewConfig(host string, port float64) *Config {
return &Config{host, port, true}
}
func (c *Config) Initialized() bool { return c != nil && c.setup }