go-可變引數

summer_last發表於2019-02-16

今天在嘗試用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{}作為可變入參時 傳入的引數要做型別轉換

相關文章