cannot use ... as ... value(型の不一致)の原因と直し方
変数の型と代入しようとする値の型が食い違うと、コンパイル時にcannot useエラーになります。Goは暗黙の型変換を行わないため、型はすべて一致している必要があります。
エラーメッセージの読み方
./main.go:6:23: cannot use 5 (untyped int constant) as string value in variable declaration
./main.go- ファイル名
6- 行番号
23- 列番号
cannot use 5 (untyped int constant) as string value in variable declaration- 詳細メッセージ — 何が問題だったか
このエラーが出る典型パターン
パターン1
1 package main 2 3 import "fmt" 4 5 func main() { 6 var name string = 5 ^ 7 fmt.Println(name) 8 }
./main.go:6:23: cannot use 5 (untyped int constant) as string value in variable declaration
string型の変数に整数リテラルをそのまま代入することはできません。ダブルクォートで囲んだ文字列にする必要があります。
直し方: 5 を "go" にします。
広告
広告スロット(未設定)
パターン2
1 package main 2 3 import "fmt" 4 5 func main() { 6 var age int = "20" ^ 7 fmt.Println(age) 8 }
./main.go:6:19: cannot use "20" (untyped string constant) as int value in variable declaration
数字に見える文字列"20"でも、Goはint型への暗黙変換を行いません。クォートを外した整数リテラルにする必要があります。
直し方: "20" を 20 にします。
パターン3
1 package main 2 3 import "fmt" 4 5 func main() { 6 var price float64 = true ^ 7 fmt.Println(price) 8 }
./main.go:6:25: cannot use true (untyped bool constant) as float64 value in variable declaration
真偽値をfloat64の変数にそのまま代入することはできません。小数リテラルを使う必要があります。
直し方: true を 9.99 にします。
パターン4
1 package main 2 3 import "fmt" 4 5 func main() { 6 var active bool = 1 ^ 7 fmt.Println(active) 8 }
./main.go:6:23: cannot use 1 (untyped int constant) as bool value in variable declaration
C言語のように0と1でbool値を表すことはできません。true/falseを直接書く必要があります。
直し方: 1 を true にします。
パターン5
1 package main 2 3 import "fmt" 4 5 func main() { 6 var count int = 3.5 ^ 7 fmt.Println(count) 8 }
./main.go:6:21: cannot use 3.5 (untyped float constant) as int value in variable declaration (truncated)
小数リテラルをint型の変数に代入しようとすると、値が切り捨てられてしまう(truncated)ためコンパイルエラーになります。
直し方: 3.5 を 3 にします。
よくある誤解
「動的型付け言語のように、変数には後からどんな型の値でも代入できるはず」という思い込みは誤りです。Goは静的型付け言語で、一度型を決めた変数には同じ型の値しか代入できません。
まとめ
cannot use ... as ... value(型の不一致)の原因と直し方は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。