今天在嘗試用go寫一個簡單的orm的時候 發現 在呼叫可變引數函式時,不是總能使用省略號將一個切片展開,有時候編譯器可能會報錯 再此用幾個簡單的例子作為說明
當不太確定資料型別的時候我們通常採用空介面
tests1(789)
fmt.Println("-------------")
tests1("789")
func tests1(arg interface{}) {
fmt.Println("value:", arg)
fmt.Println("type:", reflect.TypeOf(arg).Name())
}
輸出結果
value: 789
type: int
-------------
value: 789
type: string
在使用相同型別的可變入參時
tests([]string{"4", "5", "6"}...)
func tests(args ...string) {
for i, v := range args {
fmt.Println(i, "----", v)
}
}
輸出結果
0 ---- 4
1 ---- 5
2 ---- 6
當使用interface{}作為可變入參時
func testParams(args ...interface{}) {
for i, v := range args {
if s, ok := v.(string); ok {
fmt.Println("----", s)
}
if s, ok := v.([]string); ok {
for i, v := range s {
fmt.Println(i, "[]----", v)
}
}
fmt.Println(i, v)
}
}
出現錯誤
cannot use []string literal (type []string) as type []interface {} in argument to testParams
當看到這裡時候答案已經露出水面了
這裡提供兩種解決方案
第一種方法
s := []string{"4", "5", "6"}
var d []interface{} = []interface{}{s[0], s[1], s[2]}
testParams(d...)
結果
---- 4
0 4
---- 5
1 5
---- 6
2 6
第二種方法
s := []string{"4", "5", "6"}
var d []interface{}
d = append(d, s)
testParams(d...)
結果
0 []---- 4
1 []---- 5
2 []---- 6
0 [4 5 6]
總結: 在使用interface{}作為可變入參時 傳入的引數要做型別轉換