go-可変パラメータ
今日goで簡単なormを書こうとしたとき、可変パラメータ関数を呼び出すときに、常に省略記号を使ってスライスを展開するのではなく、コンパイラが間違って報告することがあります.これはいくつかの簡単な例で説明します.
データ型がよく分からない場合は、通常、空のインタフェースを採用します.
出力結果
同じタイプの可変パラメータを使用する場合
出力結果
Interface{}を可変パラメータとして使用する場合
エラーが発生しました
ここを見ると答えが浮かび上がって2つの解決策が提供されています
第一の方法
結果
第2の方法
結果
まとめ:interface{}を可変パラメータとして使用するときに入力されるパラメータのタイプ変換
データ型がよく分からない場合は、通常、空のインタフェースを採用します.
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{}を可変パラメータとして使用するときに入力されるパラメータのタイプ変換