go-可変パラメータ


今日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      

ここを見ると答えが浮かび上がって2つの解決策が提供されています
第一の方法
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

第2の方法
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{}を可変パラメータとして使用するときに入力されるパラメータのタイプ変換