登录
首页 >  Golang >  Go问答

困惑于 Nil 指针接口和 nil 接口

来源:stackoverflow

时间:2024-03-01 23:45:25 264浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《困惑于 Nil 指针接口和 nil 接口》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

最近,我在读《go编程语言》这本书。在第 7.5 章中,我对下面的代码感到困惑。为什么f(buf)会panic,而f(w)会panic?

package main

import (
    "bytes"
    "fmt"
    "io"
    "os"
)

func main() {
    var w io.Writer
    fmt.Printf("%T\n", w)

    f(w)

    w = os.Stdout
    fmt.Printf("%T\n", w)

    w = new(bytes.Buffer)
    fmt.Printf("%T\n", w)

    var buf *bytes.Buffer
    fmt.Printf("%T\n", buf)
    f(buf)
}

func f(out io.Writer)  {

    fmt.Printf("%T\n", out)
    if out != nil {
        out.Write([]byte("done!\n"))
    }
}

解决方案


go 中的接口类型是包含基础类型和值的对。当您创建接口变量时:

var w io.writer

它被初始化为零值,对于接口来说,是 nil。当您将其传递给需要 io.writer 的函数时,它将作为 nil 传递。

非接口指针变量的初始化类似:

var buf *bytes.Buffer

这里,bufnil。但是,当您将 buf 传递给采用 io.writer 的函数时,它必须作为接口传入。 go 将 buf 值转换为接口,其中类型为 *bytes.buffer 且底层值为 nil。然而,这个接口本身并不是nil

今天关于《困惑于 Nil 指针接口和 nil 接口》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>