一個(gè)例子
package main
import (
"bytes"
"io"
)
func main() {
var buf *bytes.Buffer
var out io.Writer = buf
if out != nil {
out.Write([]byte("hello world!\n"))
}
}
運(yùn)行后報(bào)錯(cuò)
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x105f716]
goroutine 1 [running]:
bytes.(*Buffer).Write(0x0, 0xc000014090, 0xd, 0xd, 0x0, 0x1069860, 0xc00005e058)
/usr/local/go/src/bytes/buffer.go:169 +0x26
main.main()
/Users/root/workspcae/interface/interface.go:40 +0x7a
exit status 2
主要原因是 if out != nil
這個(gè)判斷為true,但是out實(shí)際的可寫(xiě)入指針為nil
一個(gè)接口類型的值占锯,包括動(dòng)態(tài)類型
和動(dòng)態(tài)值
兩個(gè)部分袒哥。在把一個(gè)變量隱式的轉(zhuǎn)換為接口值時(shí),我們要注意該變量的值是否為nil消略。如之前的例子堡称,var buf *bytes.Buffer
,buf的值為nil艺演,但是隱式轉(zhuǎn)換var out io.Writer = buf
后粮呢,out的動(dòng)態(tài)類型為*bytes.Buffer
,動(dòng)態(tài)值為nil
钞艇,而接口類型的非空判斷,必須動(dòng)態(tài)類型和動(dòng)態(tài)值都為nil豪硅。這就導(dǎo)致了上述空指針的panic