Có cách nào để chỉ định giá trị mặc định trong hàm của Go không? Tôi đang cố gắng tìm điều này trong tài liệu nhưng tôi không thể tìm thấy bất kỳ điều gì xác định rằng điều này thậm chí có thể.
func SaySomething(i string = "Hello")(string){
...
}
Câu trả lời:
Không, các quyền lực tại Google đã chọn không hỗ trợ điều đó.
https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ
KHÔNG, nhưng có một số tùy chọn khác để triển khai giá trị mặc định. Có một số bài đăng trên blog hay về chủ đề này, nhưng đây là một số ví dụ cụ thể.
// Both parameters are optional, use empty string for default value
func Concat1(a string, b int) string {
if a == "" {
a = "default-a"
}
if b == 0 {
b = 5
}
return fmt.Sprintf("%s%d", a, b)
}
// a is required, b is optional.
// Only the first value in b_optional will be used.
func Concat2(a string, b_optional ...int) string {
b := 5
if len(b_optional) > 0 {
b = b_optional[0]
}
return fmt.Sprintf("%s%d", a, b)
}
// A declarative default value syntax
// Empty values will be replaced with defaults
type Parameters struct {
A string `default:"default-a"` // this only works with strings
B string // default is 5
}
func Concat3(prm Parameters) string {
typ := reflect.TypeOf(prm)
if prm.A == "" {
f, _ := typ.FieldByName("A")
prm.A = f.Tag.Get("default")
}
if prm.B == 0 {
prm.B = 5
}
return fmt.Sprintf("%s%d", prm.A, prm.B)
}
func Concat4(args ...interface{}) string {
a := "default-a"
b := 5
for _, arg := range args {
switch t := arg.(type) {
case string:
a = t
case int:
b = t
default:
panic("Unknown argument")
}
}
return fmt.Sprintf("%s%d", a, b)
}
func Concat1(a string = 'foo', b int = 10) string {
giống như trong hầu hết các ngôn ngữ hiện đại khác ... Nó sẽ giảm bất kỳ ví dụ nào trong số các ví dụ đã cho xuống khá nhiều thành một dòng mã.
Không, không có cách nào để chỉ định giá trị mặc định. Tôi tin rằng điều này được thực hiện có mục đích để nâng cao khả năng đọc, với chi phí là thêm một chút thời gian (và hy vọng là suy nghĩ) về phía người viết.
Tôi nghĩ rằng cách tiếp cận thích hợp để có "mặc định" là có một chức năng mới cung cấp chức năng mặc định cho chức năng chung chung hơn. Có được điều này, mã của bạn trở nên rõ ràng hơn về ý định của bạn. Ví dụ:
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
Với rất ít nỗ lực, tôi đã tạo ra một hàm thực hiện một công việc phổ biến và sử dụng lại hàm chung. Bạn có thể thấy điều này trong nhiều thư viện, fmt.Println
chẳng hạn như chỉ cần thêm một dòng mới cho những gì fmt.Print
sẽ làm. Tuy nhiên, khi đọc mã của ai đó, rõ ràng họ định làm gì bằng chức năng mà họ gọi. Với các giá trị mặc định, tôi sẽ không biết điều gì sẽ xảy ra nếu không vào hàm để tham chiếu giá trị mặc định thực sự là gì.