Language
interface: nilポインタを入れたinterfaceはnilではない
型情報とnil値を持つinterfaceは、値だけがnilのinterfaceとは異なります。
Sourcetyped_nil.go
Go 1.22
package interfacevalue
import "io"
func IsNilReader(reader io.Reader) bool {
return reader == nil
}Testtyped_nil_test.go
Go 1.22
package interfacevalue
import (
"bytes"
"testing"
)
func TestNilポインタを入れたinterfaceはnilではない(t *testing.T) {
var buffer *bytes.Buffer
if IsNilReader(buffer) {
t.Fatal("typed nil stored in an interface must not compare equal to nil")
}
}01Assertion
このテストで確認できること
- *bytes.Buffer型のnilをio.Readerへ代入する
- interface自身はnilと比較してfalseになる
interfaceを返す関数で具体型のnilを返すと、呼び出し側のerr != nilやreader != nilの判定を誤らせます。nilを返すなら型のないnilを返します。
OBSERVED RESULT
var buffer *bytes.Buffer = nil
var reader io.Reader = buffer
reader == nil → false