繁体   English   中英

将结构指针分配给接口指针

[英]Assign struct pointer to interface pointer

我正在尝试重构一些golang源代码,并且我想使用接口但是我发现了很大的困难(请耐心等待,我是一个铁杆C/C++孤儿)

我提取了一个小样本,显示我得到的错误

package main

import "fmt"

type LogProcessor interface {
    Init() int
}

type MyProcessor struct {
    a int
}

func (m MyProcessor) Init() int {
    return m.a
}

func main() {
    t := &(MyProcessor{2})
    var p *LogProcessor = &(MyProcessor{4}) //!!!fails!!!
    fmt.Println((*t).Init(), (*p).Init())
}

为什么第二个任务失败了?


添加修改后的代码以演示我正在尝试做的事情。 我认为接口更类似于 C++ 类。 我的错。 还在学习

package main

import "fmt"

type LogProcessor interface {
    Init() int
}

type MyProcessor struct {
    a int
}

func (m *MyProcessor) Init() int {
    m.a++
    return m.a
}

func main() {
    t := &(MyProcessor{2})
    m := MyProcessor{4}
    var p LogProcessor = &m
    fmt.Println(t.Init(), p.Init())
    fmt.Println(t.a, m.a)
}

表达式MyProcessor{2}是一个复合文字 获取复合文字的地址是有效的,它将是*MyProcessor类型。

所以在这里:

t := &(MyProcessor{2})

t的类型将是*MyProcessor

你的失败线:

var p *LogProcessor = &(MyProcessor{4}) //!!!fails!!!

右侧表达式的类型再次是*MyProcessor 它是一个具体类型的指针。 p的类型是*LogProcessor ,它是指向另一种类型的指针。 可分配性规则不适用于此处,因此该值根本不能分配给变量p

请注意,有一个可分配性规则:

如果以下条件之一适用,则值x可分配给T类型的变量(“ x可分配给T ”):

  • ...
  • T是一个接口类型, x实现T

在您的示例中p的类型不是接口类型,而是指向接口的指针。 你很少(如果有的话)需要这个。

相反,如果您使用“仅”接口类型:

var p LogProcessor = &(MyProcessor{4}) // This works!

这是因为具体类型*MyProcessor实现了接口类型LogProcessor 您也不需要括号,您可以简单地使用&MyProcessor{4}

那么当然你不能取消引用p (因为它不是一个指针),所以你必须使用p.Init()

它失败了,因为您使用的是指向接口的指针,如果您删除指向 LogProcessor for var p 的指针,它可以工作

package main

import "fmt"

type LogProcessor interface {
    Init() int
}

type MyProcessor struct {
    a int
}

func (m MyProcessor) Init() int {
    return 2
}

func main() {
    t := &(MyProcessor{2})
    var p LogProcessor = MyProcessor{4} // works without a pointer to  the interface type
    fmt.Println((*t).Init(), (p).Init())
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM