为什么我不能从主包中调用一个包含方法集合的接口?

huangapple go评论85阅读模式
英文:

Why can't I call an interface with a collection of methods from the main package

问题

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

我有以下结构:

  • 包a

    • a_core.go
    • a.go
    • models.go
  • main.go

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

a.go有一个空结构体,它是私有的,并且有一个公共接口,我希望通过各种方法来公开它。

a_core.go只包含一些业务逻辑,将在我的接口实现中调用。

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

a.go中的代码

package a

type myFunction struct{}

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

// 可以公开访问的具体实现
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)

当我这样做时,我得到以下错误:

too few arguments in call to a.MyFunc.Create

cannot use data (variable of type *a.MyData) as a.MyFunc value in argument to a.MyFunc.Create: missing method CreatecompilerInvalidIfaceAssign

请问我做错了什么?

英文:

I am really new to golang and I am trying to see how encapsulation really works in go.

I have the following structure

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

-- main.go

In models.go I have structs for request and responses for an api call,

a.go has an empty struct, which is private and a public interface, which I want to expose with various methods

a_core.go just has some business logic which would be called in my interface implementation

Then, I have a main.go where I just call the public interface.

code in 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) {

}

In main.go, I call the interface my first create the MyData pointer with values

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

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

I get the following error when I do this,

too few arguments in call to a.MyFunc.Create

cannot use data (variable of type *a.MyData) as a.MyFunc value in argument to a.MyFunc.Create: missing method CreatecompilerInvalidIfaceAssign

Please what am I doing wrong?

答案1

得分: 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.Lion{Age: 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")
}
英文:

Here is an example
Note that names in uppercase are public, in lowercase private (see https://tour.golang.org/basics/3 )

./go-example/main.go

package main

import "go-example/animal"

func main() {
	var a animal.Animal
	a = animal.Lion{Age: 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")
}

huangapple
  • 本文由 发表于 2021年11月21日 06:23:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/70050330.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定