Điều này không được kiểm tra kỹ lưỡng đối với một loạt các giá trị, nhưng nó hoạt động trong một vài trường hợp đơn giản. Cảm thấy tự do để mở rộng hơn nữa cho nhu cầu của riêng bạn. Nó cũng không đảm bảo được bất cứ điều gì giống như cách tốt nhất để làm điều này, và kiểm tra lỗi còn lại là một bài tập cho người đọc.
func parseArguments(args ...interface{}) map[string]interface{} {
if args == nil {
return nil
}
if x,ok := args[0].(map[string]interface{}); ok {
return x
}
x := map[string]interface{}{}
for i := 0; i < len(args); i += 2 {
x[ args[i].(string) ] = args[i+1]
}
return x
}
func DoSomethingCool(x ...interface{}) {
args := parseArguments(x);
// args is now a map of type map[string]interface{}
}
Bây giờ bạn có thể gọi DoSomethingCool()
trong bất kỳ trong các cách sau:
// No arguments
DoSomethingCool()
// These two are equivalent, and result in
// args = map[string]interface{}{
// "foo": "bar",
// "baz": "qux",
// }
DoSomethingCool(map[string]string{"foo": "bar", "baz": "qux"})
DoSomethingCool("foo","bar","baz","qux")
// Or you can even mix types for the keys, thanks to interface{}
// These two are also equivalents and result in
// args = map[string]interface{}{
// "foo": 20,
// "bar": false,
// }
DoSomethingCool(map[string]interface{}{"foo": 20, "bar": false})
DoSomethingCool("foo",20,"bar",false)
Nếu bạn không có nhu cầu để trộn các loại giá trị, bạn có thể chỉ cần cũng sử dụng map[string]string
tôi tưởng tượng.
Nó có thể được thực hiện bởi sự phản ánh của Golang không? –