Golang 1.17.x 空指针类 能正常调用类方法

xiaoyi510 · 2021-12-30 14:32:25 · 1065 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-12-30 14:32:25 的主题,其中的信息可能已经有所发展或是发生改变。

代码如下

type A struct {
}

func (this *A) Test() string {
    return "123"
}

type C struct {
    client *A
}

func main() {
    c := C{}
    log.Println(c.client.Test())
    var a *A
    log.Println(a.Test())
}

期望如 1.16.x会抛出 panic 错误才对

不知道为何1.17.x 为何会处理为正常输出

这样不是会出现更多坑吗


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1065 次点击  
加入收藏 微博
6 回复  |  直到 2021-12-31 11:51:30
xiaoyi510
xiaoyi510 · #1 · 3年之前

image.png

不对 我使用1.16.5也不报错

朋友的go就报错 image.png

xiaoyi510
xiaoyi510 · #2 · 3年之前
func (this *A) Test() string {
    return "123"
}

不报错

报错 此报错我觉得是正常的毕竟没实例化

func (this A) Test() string {
    return "123"
}
zzustu
zzustu · #3 · 3年之前

看看下面这几种方式能否对你有启发

type A struct {
}

func (a *A) Exec() string {
    return "123"
}

func Exec(a *A) string {
    return "123"
}

func TestNil(t *testing.T) {
    r1 := (*A).Exec(nil)
    t.Log(r1) // 输出 123

    r2 := (*A)(nil).Exec()
    t.Log(r2) // 输出 123

    r3 := Exec(nil)
    t.Log(r3) // 输出 123
}
jan-bar
jan-bar · #4 · 3年之前

根据官方祖传代码显示,go天生就这样吧。

// Close closes the File, rendering it unusable for I/O.
// On files that support SetDeadline, any pending I/O operations will
// be canceled and return immediately with an error.
// Close will return an error if it has already been called.
func (f *File) Close() error {
    if f == nil {
        return ErrInvalid
    }
    return f.file.close()
}
jarlyyn
jarlyyn · #5 · 3年之前

这真的是个feature,虽然很多人不喜欢

https://go.dev/tour/methods/12

abelli5
abelli5 · #6 · 3年之前

涉及到对golang中结构体的定义。从这一点严格来说golang不是OO语言,更接近于c语言、而不是c++。 golang 中所有的方法都写在了结构体外,编译器应该将其处理为全局静态方法,只是第一个参数标明了它所属结构体。 A.Test() 方法没有访问this的结构体成员变量,不报错是正常的。如果访问了this的成员变量,就会报错。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传