Go言語の「cannot use [型] as type [型] in argument to [関数名]」エラーの例と対処法
Go言語でプログラムを書いているときに、「cannot use [型] as type [型] in argument to [関数名]」というエラーに遭遇したことはありますか?
このエラーは、関数に渡す引数の型が関数が期待する型と一致しないときに発生します。
この記事では、このエラーが発生する具体的なソースコードと、それぞれの対処法について説明します。
他のエラーはコチラ
-
【Golang】Go言語でよく発生するエラー一覧8選
Go言語の一般的なエラーとその対処法 これから解説するエラー undefined: [変数名] syntax error: unexpected [トークン], expecting [トークン] re ...
続きを見る
1. 整数を期待する関数に文字列を渡した場合
最初の例は、整数を期待する関数に文字列を渡した場合です。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "fmt" "strconv" ) func add(x, y int) int { return x + y } func main() { x := "5" y := 3 z := add(x, y) fmt.Println(z) } |
上記のコードを実行すると、以下のようなエラーメッセージが表示されます。
出力結果
./prog.go:14:11: cannot use x (type string) as type int in argument to add
はい、その通りです。
この問題を解決するには、文字列を整数に変換する必要があります。
以下に修正したソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package main import ( "fmt" "strconv" ) func add(x, y int) int { return x + y } func main() { x, _ := strconv.Atoi("5") y := 3 z := add(x, y) fmt.Println(z) } |
修正したソースコードを実行すると、以下のように期待通りの結果が得られます。
出力結果
8
ポイント
2. スライスを期待する関数に配列を渡した場合
次の例は、スライスを期待する関数に配列を渡した場合です。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import "fmt" func printLength(s []int) { fmt.Println(len(s)) } func main() { a := [3]int{1, 2, 3} printLength(a) } |
上記のコードを実行すると、以下のようなエラーメッセージが表示されます。
出力結果
./prog.go:11:14: cannot use a (type [3]int) as type []int in argument to printLength
はい、その通りです。
この問題を解決するには、配列をスライスに変換する必要があります。
以下に修正したソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
package main import "fmt" func printLength(s []int) { fmt.Println(len(s)) } func main() { a := [3]int{1, 2, 3} printLength(a[:]) } |
修正したソースコードを実行すると、以下のように期待通りの結果が得られます。
出力結果
3
ポイント
3. ポインタを期待する関数に値を渡した場合
次の例は、ポインタを期待する関数に値を渡した場合です。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import "fmt" func increment(x *int) { *x++ } func main() { a := 5 increment(a) fmt.Println(a) } |
上記のコードを実行すると、以下のようなエラーメッセージが表示されます。
出力結果
./prog.go:11:12: cannot use a (type int) as type *int in argument to increment
はい、その通りです。
この問題を解決するには、値の代わりにその値のポインタを渡す必要があります。
以下に修正したソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import "fmt" func increment(x *int) { *x++ } func main() { a := 5 increment(&a) fmt.Println(a) } |
修正したソースコードを実行すると、以下のように期待通りの結果が得られます。
出力結果
6
ポイント
4. インターフェース型を期待する関数に満たさない型の値を渡した場合
次の例は、インターフェース型を期待する関数に、そのインターフェースを満たさない型の値を渡した場合です。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package main import "fmt" type Printer interface { Print() } type MyInt int func printAnything(p Printer) { p.Print() } func main() { var a MyInt = 5 printAnything(a) } |
上記のコードを実行すると、以下のようなエラーメッージが表示されます。
出力結果
./prog.go:16:14: cannot use a (type MyInt) as type Printer in argument to printAnything: MyInt does not implement Printer (missing Print method)
その通りです。
この問題を解決するには、MyInt型にPrinterインターフェースが要求するPrintメソッドを実装する必要があります。
以下に修正したソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package main import "fmt" type Printer interface { Print() } type MyInt int func (m MyInt) Print() { fmt.Println(m) } func printAnything(p Printer) { p.Print() } func main() { var a MyInt = 5 printAnything(a) } |
修正したソースコードを実行すると、以下のように期待通りの結果が得られます。
出力結果
5
ポイント
まとめ
Go言語では、型が厳密にチェックされるため、「cannot use [型] as type [型] in argument to [関数名]」のような型関連のエラーが発生することがあります。
関数が期待する型と異なる型の値を渡すと、このようなエラーが発生します。
そのため、関数を使用する際には引数の型を確認し、必要に応じて型変換を行うことが重要です。
また、インターフェース型を期待する関数に値を渡す場合には、その値がインターフェースを満たすかどうかを確認することも重要です。
これらの点を注意しながらプログラミングを行うことで、型関連のエラーを避けることができます。
具体的なエラーとその解決方法については、本記事の各セクションを参照してください。
最後まで読んで頂き、ありがとうございました。少しでもお役にたてたなら幸いです!
他のエラーはコチラ
-
【Golang】Go言語でよく発生するエラー一覧8選
Go言語の一般的なエラーとその対処法 これから解説するエラー undefined: [変数名] syntax error: unexpected [トークン], expecting [トークン] re ...
続きを見る