登录
首页 >  Golang >  Go问答

接口可以是 nil 类型,但这并不意味着它们是 nil?

来源:stackoverflow

时间:2024-04-07 16:57:39 469浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《接口可以是 nil 类型,但这并不意味着它们是 nil?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我写了一些代码,实际上是这样做的:

package main

import "fmt"

type someinterface interface {
    retrieve(identifier string)
}

type somestruct struct {}

func (r somestruct) retrieve(identifier string) {
    fmt.println("identifier ", identifier)
}

type handler struct {
    name string
    someobject someinterface
}

func main() {
    var somestruct *somestruct
    var h = handler{
        name: "helo",
        someobject: somestruct,
    }
    fmt.printf("before %+v\r\n", h.someobject)
    if h.someobject == nil {
        fmt.printf("during %+v\r\n", h.someobject)
    }
    fmt.printf("after %+v\r\n", h.someobject)
}

请有人向我解释一下为什么上面的输出是:

before 
after 

我一直在阅读有关 nil 类型的接口的信息,但在这种情况下,我已将接口分配给尚未分配的指针,因此我认为接口 == nil 并且我会在 期间看到 -可惜事实并非如此。


解决方案


接口值是一种简单的数据结构,由两部分组成:类型和基础值。因此,接口值本身可以是 nil,或者接口值可以存在但底层值可以是 nil。例如:

var x interface{} = nil // x is nil
var y interface{} = (interface{})(nil) // y is a interface{}, which *contains* nil

这在某些方面在概念上类似于这种差异:

var x []*int = nil // x is nil
var y []*int = []*int{nil} // y is a []*int, which *contains* nil

fmt.printf 由于格式化输出的方式而掩盖了接口情况的差异;如果您愿意,您可以使用反射更清楚地看到差异。

今天关于《接口可以是 nil 类型,但这并不意味着它们是 nil?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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