Trong Go có nhiều cách khác nhau để trả về struct
giá trị hoặc lát. Đối với những người cá nhân tôi đã thấy:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Tôi hiểu sự khác biệt giữa những điều này. Cái đầu tiên trả về một bản sao của struct, cái thứ hai là một con trỏ tới giá trị struct được tạo trong hàm, cái thứ ba hy vọng một cấu trúc hiện có sẽ được truyền vào và ghi đè giá trị.
Tôi đã thấy tất cả các mẫu này được sử dụng trong các bối cảnh khác nhau, tôi tự hỏi những thực tiễn tốt nhất liên quan đến những mẫu này. Khi nào bạn sẽ sử dụng cái nào? Ví dụ, cái đầu tiên có thể ổn đối với các cấu trúc nhỏ (vì chi phí tối thiểu), thứ hai cho các cấu trúc lớn hơn. Và thứ ba nếu bạn muốn cực kỳ hiệu quả bộ nhớ, bởi vì bạn có thể dễ dàng sử dụng lại một thể hiện cấu trúc duy nhất giữa các cuộc gọi. Có thực hành tốt nhất khi sử dụng cái nào không?
Tương tự, câu hỏi tương tự liên quan đến lát:
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} }
}
Một lần nữa: những thực hành tốt nhất ở đây là gì. Tôi biết các lát luôn là con trỏ, vì vậy việc trả về một con trỏ tới một lát không hữu ích. Tuy nhiên, tôi có nên trả lại một lát các giá trị cấu trúc, một lát con trỏ cho các cấu trúc không, tôi có nên chuyển một con trỏ tới một lát làm đối số (một mẫu được sử dụng trong API của Máy ứng dụng Go ) không?
new(MyStruct)
:) Nhưng thực sự không có sự khác biệt giữa các phương pháp phân bổ con trỏ khác nhau và trả lại chúng.