nil - Go

最終更新日: 2026-07-25

TOP(About this memo)) > 一覧(Go) > nil

nilリテラルのvariableへの代入

import (
	"fmt"
	"reflect"
)

func main() {
    // 型のないnilのvariableはコンパイルエラーとなる
	// var a = nil // use of untyped nil in variable declaration

    // ポインタ型には格納できる
	var a *int = nil 
	fmt.Printf("%v, %v \n", reflect.TypeOf(a), reflect.ValueOf(a))// *int, <nil> 

    // interface型にも格納できる
    var ii i = nil
	fmt.Printf("%v, %v \n", reflect.TypeOf(ii), reflect.ValueOf(ii))// <nil>, <invalid reflect.Value> 
    var err error = nil
	fmt.Printf("%v, %v \n", reflect.TypeOf(err), reflect.ValueOf(err))// <nil>, <invalid reflect.Value> 
	var iii i = (*int)(nil)
	fmt.Printf("%v, %v \n", reflect.TypeOf(iii), reflect.ValueOf(iii))// *int, <nil> 
}

nilリテラル、nilが格納されたvariable, interface, それらの型情報

nilのキャスト

package main

func main() {
	f(nil)// ポインターの場合はnilを持つことができるため問題ない。
	//f2(nil)// Cannot infer T 
	f2((*string)(nil))
	f2[any](nil)// なお、これでも通る
}	

func f(a *string) {}
func f2[T any](a T) {}

nilの比較

//println(nil == nil) // operator == not defined on untyped nil
//println((*int32)(nil) == (*int64)(nil)) //mismatched types *int32 and *int64
println((*int32)(nil) == (*int32)(nil)) // true
println((*int32)(nil) == nil) // これも、true
println(nil == (error)(nil))// これもtrue
println(reflect.ValueOf((*int32)(nil)).IsNil()) // true

Typed-nil問題