Code Fix

初級

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の変数にそのまま代入することはできません。小数リテラルを使う必要があります。

直し方: true9.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を直接書く必要があります。

直し方: 1true にします。

この問題を解いてみる →

パターン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.53 にします。

この問題を解いてみる →

よくある誤解

「動的型付け言語のように、変数には後からどんな型の値でも代入できるはず」という思い込みは誤りです。Goは静的型付け言語で、一度型を決めた変数には同じ型の値しか代入できません。

まとめ

cannot use ... as ... value(型の不一致)の原因と直し方は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)