Go 语言圣经 7.5 接口值

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语言基础

代码仓库

猜你喜欢

转载自blog.csdn.net/liushihua147/article/details/80609463