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 }
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 }
数字に見える文字列"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 }
真偽値を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 }
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 }
小数リテラルをint型の変数に代入しようとすると、値が切り捨てられてしまう(truncated)ためコンパイルエラーになります。
直し方: 3.5 を 3 にします。
よくある誤解
「動的型付け言語のように、変数には後からどんな型の値でも代入できるはず」という思い込みは誤りです。Goは静的型付け言語で、一度型を決めた変数には同じ型の値しか代入できません。
実務での勘所
Goの「暗黙の変換をしない」という原則には、実は型無し定数(untyped constant)という重要な例外があります。const x = 5のように型を明示せずに定数を宣言すると、その定数は文脈に応じてint、float64、int8など、必要な数値型に自動的に適応します。ただしこれはあくまで定数だけの特別扱いで、一度変数になってしまえば、この柔軟性は失われ通常の厳格な型チェックの対象になります。「5だけは自由に使えたのに、変数に入れた瞬間に厳しくなった」と感じるのは、この定数限定の特例のせいです。