這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
今天在嘗試用go寫一個簡單的orm的時候 發現 在調用可變參數函數時,不是總能使用省略符號將一個切片展開,有時候編譯器可能會報錯 再此用幾個簡單的例子作為說明
當不太確定資料類型的時候我們通常採用空介面
tests1(789)fmt.Println("-------------")tests1("789")
func tests1(arg interface{}) { fmt.Println("value:", arg) fmt.Println("type:", reflect.TypeOf(arg).Name())}
輸出結果
value: 789type: int-------------value: 789type: string
在使用相同類型的可變入參時
tests([]string{"4", "5", "6"}...)
func tests(args ...string) { for i, v := range args { fmt.Println(i, "----", v) }}
輸出結果
0 ---- 41 ---- 52 ---- 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...)
結果
---- 40 4---- 51 5---- 62 6
第二種方法
s := []string{"4", "5", "6"}var d []interface{}d = append(d, s)testParams(d...)
結果
0 []---- 41 []---- 52 []---- 60 [4 5 6]
總結: 在使用interface{}作為可變入參時 傳入的參數要做類型轉換