7.5 接口值
- 1.有两部分组成:一个具体的类型,一个此类型的值
- 2.也被称为动态类型和动态值
- 3.一个接口值可以持有任意大的动态值
- 4.一个接口上的调用必须使用动态分配
- 5.接口值得动态类型如果是可以比较的,即可以作为map的key或者switch的语句操作数
- 一个不包含任何值的nil接口值和一个刚好包含nil指针的接口值是不同的
代码
章节中样例
func test_interface_value() {
var w io.Writer
fmt.Println(w,"---0")
w = os.Stdout
fmt.Println(w,"---1")
w = new(bytes.Buffer)
fmt.Println(w,"---2")
w = nil
fmt.Println(w,"---3")
const debug = false
var buf io.Writer//*bytes.Buffer
if debug {
buf = new(bytes.Buffer) // enable collection of output
}
f_nil(buf) // NOTE: subtly incorrect!
if debug {
// ...use buf...
}
//f_nil(buf):违反了(*bytes.Buffer).Write方法的接收者非空的隐含先觉条件
//debug -- false : panic: runtime error: invalid memory address or nil pointer dereference
fmt.Println(buf)
//7.对于一些如*os.File的类型,nil是一个有效的接收者,但是*bytes.Buffer类型不在这些类型中
}
//如果输出的是非nil,输出江北写入Write函数
func f_nil(out io.Writer) {
// ...do something...
if out != nil {
out.Write([]byte("done!\n"))
}
}
备注
《Go 语言圣经》
学习记录所使用的GO版本是1.8
学习记录所使用的编译器工具为GoLand
学习记录所使用的系统环境为Mac os
学习者有一定的C语言基础