将指针传递给接口时函数抛出错误?

时间:2018-12-13 13:05:00

标签: go

这就是我遇到的问题,我不明白为什么会出错:

package main

import (
    "fmt"
)

// define a basic interface
type I interface {
    get_name() string
}

// define a struct that implements the "I" interface
type Foo struct {
    Name string
}

func (f *Foo) get_name() string {
    return f.Name
}

// define two print functions:
// the first function accepts *I. this throws the error
// changing from *I to I solves the problem
func print_item1(item *I) {
    fmt.Printf("%s\n", item.get_name())
}

// the second function accepts *Foo. works well
func print_item2(item *Foo) {
    fmt.Printf("%s\n", item.get_name())
}

func main() {
    print_item1(&Foo{"X"})
    print_item2(&Foo{"Y"})
}

两个相同的函数接受一个参数:指向接口或实现该接口的结构的指针。
第一个接受指向该接口的指针的编译器不会编译错误item.get_name undefined (type *I is pointer to interface, not interface)
*I更改为I可解决该错误。

我想知道为什么有区别吗?第一个函数非常常见,因为它允许单个函数与各种结构一起使用,只要它们实现I接口即可。

此外,当函数定义为接受I但实际上却收到一个 pointer &Foo{})时,该函数如何编译?函数是否应该期望像Foo{}这样的东西(即不是指针)?

1 个答案:

答案 0 :(得分:0)

对此的快速解决方案是使print_item1仅接受I而不是指向I的指针。

func print_item1(item I)

这样做的原因是*Foo满足I接口,但请记住*Foo不是*I

我强烈建议您阅读Russ Cox's explanation of the implementation of interfaces