ในการไปมีหลายวิธีในการคืนstruct
ค่าหรือชิ้นส่วนดังกล่าว สำหรับคนที่ฉันเคยเห็น:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
ฉันเข้าใจความแตกต่างระหว่างสิ่งเหล่านี้ ครั้งแรกที่ส่งกลับสำเนาของ struct ตัวชี้ที่สองไปยังค่า struct ที่สร้างขึ้นภายในฟังก์ชั่นที่สามคาดว่าโครงสร้างที่มีอยู่จะถูกส่งผ่านและแทนที่ค่า
ฉันเห็นรูปแบบเหล่านี้ทั้งหมดถูกใช้ในบริบทต่าง ๆ ฉันสงสัยว่าแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับสิ่งเหล่านี้คืออะไร คุณจะใช้อันไหน ตัวอย่างเช่นตัวแรกอาจใช้ได้กับโครงสร้างขนาดเล็ก และอันที่สามถ้าคุณต้องการให้หน่วยความจำมีประสิทธิภาพมากเพราะคุณสามารถใช้อินสแตนซ์ struct ระหว่างการโทรได้อย่างง่ายดาย มีวิธีปฏิบัติที่ดีที่สุดสำหรับเมื่อใดที่จะใช้
ในทำนองเดียวกันคำถามเดียวกันเกี่ยวกับชิ้น:
func myfunc() []MyStruct {
return []MyStruct{ MyStruct{Val: 1} }
}
func myfunc() []*MyStruct {
return []MyStruct{ &MyStruct{Val: 1} }
}
func myfunc(s *[]MyStruct) {
*s = []MyStruct{ MyStruct{Val: 1} }
}
func myfunc(s *[]*MyStruct) {
*s = []MyStruct{ &MyStruct{Val: 1} }
}
อีกครั้ง: สิ่งที่เป็นแนวทางปฏิบัติที่ดีที่สุดที่นี่ ฉันรู้ว่าสไลซ์เป็นพอยน์เตอร์เสมอดังนั้นการคืนค่าพอยน์เตอร์ไปยังชิ้นจึงไม่เป็นประโยชน์ อย่างไรก็ตามฉันควรส่งคืนค่า struct เป็นชิ้นส่วนของพอยน์เตอร์ไปยัง struct ฉันควรส่งผ่านตัวชี้ไปยังชิ้นเป็นอาร์กิวเมนต์ (รูปแบบที่ใช้ในGo App Engine API ) หรือไม่
new(MyStruct)
:) แต่ไม่มีความแตกต่างระหว่างวิธีการจัดสรรพอยน์เตอร์และการส่งคืน