MeWrite Docs

cannot use x (type T) as type U in assignment

Goで型が一致しない代入を行った際のコンパイルエラー

概要

Goで変数に値を代入する際、変数の型と値の型が一致しない場合に発生するコンパイルエラーです。Goは静的型付け言語であり、暗黙の型変換を行いません。

エラーメッセージ

cannot use x (type int) as type int64 in assignment
cannot use s (type string) as type []byte in argument to fmt.Println
cannot use f (type func()) as type func() error in assignment

原因

  1. 数値型の不一致: int、int32、int64などの混在
  2. カスタム型: 同じ基底型でも別の型として定義されている
  3. インターフェースの未実装: 必要なメソッドが実装されていない
  4. 関数シグネチャの不一致: 引数や戻り値の型が異なる

解決策

1. 明示的な型変換

1
2
3
4
5
6
7
// Bad
var i int = 42
var i64 int64 = i // Error

// Good
var i int = 42
var i64 int64 = int64(i)

2. 数値型の変換

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 整数同士
i := 42
i32 := int32(i)
i64 := int64(i)

// 浮動小数点
f := 3.14
i := int(f) // 3(小数点以下は切り捨て)

// 文字列と数値
import "strconv"

s := "42"
i, err := strconv.Atoi(s)

i := 42
s := strconv.Itoa(i)

3. カスタム型の変換

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
type UserID int
type ProductID int

// Bad
var userID UserID = 1
var productID ProductID = userID // Error

// Good: 明示的に変換
var userID UserID = 1
var productID ProductID = ProductID(userID)

// または基底型を経由
var productID ProductID = ProductID(int(userID))

4. スライスと配列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 配列からスライス
arr := [3]int{1, 2, 3}
slice := arr[:] // []int

// stringと[]byte
s := "hello"
b := []byte(s)
s2 := string(b)

// stringと[]rune
r := []rune(s)
s3 := string(r)

5. インターフェースの実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
type Writer interface {
    Write([]byte) (int, error)
}

type MyWriter struct{}

// Bad: メソッドシグネチャが異なる
func (w MyWriter) Write(s string) error {
    return nil
}

// Good: インターフェースに合わせる
func (w MyWriter) Write(p []byte) (int, error) {
    return len(p), nil
}

6. 関数型の一致

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
type Handler func(string) error

// Bad
func myFunc(s string) { // 戻り値がない
    fmt.Println(s)
}
var h Handler = myFunc // Error

// Good
func myFunc(s string) error {
    fmt.Println(s)
    return nil
}
var h Handler = myFunc

7. ジェネリクス(Go 1.18+)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 型パラメータを使用
func Min[T constraints.Ordered](a, b T) T {
    if a < b {
        return a
    }
    return b
}

result := Min(1, 2)       // int
result := Min(1.0, 2.0)   // float64

8. 型アサーション

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
var i interface{} = "hello"

// 型アサーション
s := i.(string) // パニックの可能性あり

// 安全な型アサーション
s, ok := i.(string)
if ok {
    fmt.Println(s)
}

// 型スイッチ
switch v := i.(type) {
case string:
    fmt.Println("string:", v)
case int:
    fmt.Println("int:", v)
default:
    fmt.Println("unknown type")
}

よくある間違い

  • int と int64 を同じ型だと思い込む
  • 定義した型(type X int)と基底型(int)を混同する
  • interface{}から具体的な型に変換せずに使用する

関連エラー

参考リンク

Go の他のエラー

最終更新: 2025-12-13