Có nhiều câu trả lời / kỹ thuật cho câu hỏi dưới đây:
- Làm cách nào để đặt giá trị mặc định cho cấu trúc golang?
- Làm thế nào để khởi tạo cấu trúc trong golang
Tôi có một vài câu trả lời nhưng cần thảo luận thêm.
Có nhiều câu trả lời / kỹ thuật cho câu hỏi dưới đây:
Tôi có một vài câu trả lời nhưng cần thảo luận thêm.
Câu trả lời:
Một ý tưởng có thể là viết hàm xây dựng riêng
//Something is the structure we work with
type Something struct {
Text string
DefaultText string
}
// NewSomething create new instance of Something
func NewSomething(text string) Something {
something := Something{}
something.Text = text
something.DefaultText = "default text"
return something
}
NewSomething
và thậm chí các trường Text
và DefaultText
, nhưng không xuất kiểu cấu trúc something
.
reflect.New()
chẳng hạn như thông qua ), bạn không thể biết về chức năng xuất xưởng được đặt tên đặc biệt của mình. Trong trường hợp đó, và thiếu ngôn ngữ bị thay đổi, chỉ có một giao diện (mà thư viện có thể kiểm tra) sẽ làm, tôi nghĩ vậy.
Buộc một phương thức để có được cấu trúc (cách xây dựng).
Một thiết kế tốt là làm cho kiểu của bạn không được báo cáo, nhưng cung cấp hàm xây dựng được xuất như NewMyType () trong đó bạn có thể khởi tạo chính xác cấu trúc / kiểu của mình. Đồng thời trả về một loại giao diện chứ không phải loại cụ thể và giao diện sẽ chứa mọi thứ người khác muốn làm với giá trị của bạn. Và loại bê tông của bạn phải thực hiện giao diện đó tất nhiên.
Điều này có thể được thực hiện bằng cách đơn giản làm cho loại chính nó không được quan tâm. Bạn có thể xuất hàm NewS Something và thậm chí các trường Text và DefaultText, nhưng chỉ không xuất kiểu cấu trúc gì đó
Một cách khác để tùy chỉnh mô-đun cho mô-đun của riêng bạn là sử dụng Cấu trúc cấu hình để đặt giá trị mặc định (Tùy chọn 5 trong liên kết) Mặc dù không phải là một cách hay.
Một vấn đề với tùy chọn 1 trong câu trả lời của Victor Zamanian là nếu loại không được xuất thì người dùng gói của bạn không thể khai báo đó là loại cho các tham số chức năng, v.v. Một cách khác là sẽ xuất giao diện thay vì cấu trúc ví dụ
package candidate
// Exporting interface instead of struct
type Candidate interface {}
// Struct is not exported
type candidate struct {
Name string
Votes uint32 // Defaults to 0
}
// We are forced to call the constructor to get an instance of candidate
func New(name string) Candidate {
return candidate{name, 0} // enforce the default value here
}
Cho phép chúng tôi khai báo các loại tham số chức năng bằng giao diện Ứng viên đã xuất. Nhược điểm duy nhất tôi có thể thấy từ giải pháp này là tất cả các phương thức của chúng tôi cần được khai báo trong định nghĩa giao diện, nhưng bạn có thể lập luận rằng đó là cách thực hành tốt.
Votes unit32
Votes uint32
Có một cách để làm điều này với các thẻ, cho phép nhiều mặc định.
Giả sử bạn có cấu trúc sau, với 2 thẻ mặc định default0 và default1 .
type A struct {
I int `default0:"3" default1:"42"`
S string `default0:"Some String..." default1:"Some Other String..."`
}
Bây giờ có thể Đặt mặc định.
func main() {
ptr := &A{}
Set(ptr, "default0")
fmt.Printf("ptr.I=%d ptr.S=%s\n", ptr.I, ptr.S)
// ptr.I=3 ptr.S=Some String...
Set(ptr, "default1")
fmt.Printf("ptr.I=%d ptr.S=%s\n", ptr.I, ptr.S)
// ptr.I=42 ptr.S=Some Other String...
}
Đây là chương trình hoàn chỉnh trong một sân chơi .
Nếu bạn quan tâm đến một ví dụ phức tạp hơn, hãy nói với các lát và bản đồ, sau đó, hãy xem cTHERy / defaultse
Từ https://golang.org/doc/effective_go.html#compổng_literals :
Đôi khi giá trị 0 không đủ tốt và một hàm tạo khởi tạo là cần thiết, như trong ví dụ này xuất phát từ gói os.
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
}
f := new(File)
f.fd = fd
f.name = name
f.dirinfo = nil
f.nepipe = 0
return f
}
type Config struct {
AWSRegion string `default:"us-west-2"`
}