为啥我不能用主包中的方法集合调用接口

Posted

技术标签:

【中文标题】为啥我不能用主包中的方法集合调用接口【英文标题】:Why can't I call an interface with a collection of methods from the main package为什么我不能用主包中的方法集合调用接口 【发布时间】:2021-12-31 03:24:51 【问题描述】:

我对 golang 很陌生,我正在尝试了解封装在 go 中的真正工作原理。

我有以下结构

-- package a
    -a_core.go
    -a.go
    -models.go

-- main.go

models.go 中,我有用于 api 调用的请求和响应的结构,

a.go 有一个空结构,它是私有的和一个公共接口,我想用各种方法公开它

a_core.go 只是有一些将在我的接口实现中调用的业务逻辑

然后,我有一个 ma​​in.go,我只是在其中调用公共接口。

a.go 中的代码

package a

type myFunction struct

type MyFunc interface 
 Create(myData *MyData) (*MyData, error)
 Fetch(test string)
 Delete(test string)


//Concrete implementations that can be accessed publicly
func (a *myFunction) Create(data *MyData) (*MyData, error) 
  return nil, nil   


func (a *myFunction) Fetch(test string) 



func (a *myFunction) Delete(test string) 


在 main.go 中,我首先调用接口创建带有值的 MyData 指针

data := &a.MyData
 /////


result, err := a.MyFunc.Create(data)

执行此操作时出现以下错误,

调用 a.MyFunc.Create 时的参数太少

不能将数据(*a.MyData 类型的变量)用作 a.MyFunc.Create 参数中的 a.MyFunc 值:缺少方法 CreatecompilerInvalidIfaceAssign

请问我做错了什么?

【问题讨论】:

这个playground example 可能会帮助您了解接口的工作原理(tour 有更多信息)。 @Brits 非常感谢你 【参考方案1】:

这是一个例子 请注意,大写的名称是公开的,小写的是私有的(请参阅https://tour.golang.org/basics/3)

./go-example/main.go

package main

import "go-example/animal"

func main() 
    var a animal.Animal
    a = animal.LionAge: 10
    a.Breathe()
    a.Walk()

./go-example/animal/animal.go

package animal

import "fmt"

type Animal interface 
    Breathe()
    Walk()


type Lion struct 
    Age int


func (l Lion) Breathe() 
    fmt.Println("Lion breathes")


func (l Lion) Walk() 
    fmt.Println("Lion walk")

【讨论】:

我试图从不同的包中引用它。因此,为什么我必须做一个 package.interfacename.methodname 并且这些方法已经在空结构 myFunction 上实现 更新了我的答案

以上是关于为啥我不能用主包中的方法集合调用接口的主要内容,如果未能解决你的问题,请参考以下文章

Java 集合框架迭代器(Iterator)

Java集合中的Map接口

集合框架

我可以使用核心数据读取和写入主包中的数据库吗?

java基础2

JAVA中的集合类:List,Set及Map的层级关系