比如 我要把Beahavior 放到叫interfaces的目录,结构体Dog单独放一个叫model的目录,Eat放到 其它目录文件实现。怎么做呢?
```go
package main
import (
"fmt"
)
// 定义接口
type Beahavior interface {
Run() string
Eat(thing string) string
}
type Dog struct {
Name string
}
func (d * Dog) Eat(thing string ) string {
return "hello i am eating "+thing
}
func (d * Dog) Run() string {
return "hello i am running"
}
func main() {
d := Dog{Name:"旺财"}
res := d.Eat("apple")
fmt.Println(res)
}
```
比如 下面好像行不通,提示无法解析model.Dog
demo/model/s.go //demo是根目录
```go
import "demo/model"
func (d * model.Dog) Eat(thing string ) string {
return "hello i am eating "+thing
}
```
Soga,因为实现接口需要接收一个结构体,利用同目录,同包,两个文件中结构体共用 的思路 吗?咋给java不一样呢。java entiy文件,实现接口文件,是能放不同目录的。被搞晕了
#2
更多评论
我不太明白你的意思,我就说说我的理解把,首先别把其他语言特性带入到 Go,最好还是把 Go 语言基础过一遍,这个问题相关有 **包和文件**、**接口** 两个基础知识点。
Go 语言里面,一个目录就是一个包,包内的所有 `.go` 文件都可以相互使用,也就是说你可以在 *a.go* 文件里定义了一个结构体,然后在 *b.go* 里面给这个结构体添加方法,因为是在同一个包里,所以是可以的。
但你问题中的描述,`Dog` 结构体定义在 *model* 目录下,那么想给 `Dog` 添加方法,你只能在 *model* 目录下的 `.go` 文件中添加,而不能放到其他目录中去实现。
另外 Go 语言中的接口是 duck typing,接口的定义和具体的实现是可以不在同一个包的,所以 `Beahavior` 放在 *interfaces* 目录下,而 `Dog` 在 *model* 目录下去实现它是可以的。这个应该很好理解把,比如我们可以在自己的项目中实现标准库里的所有接口。
```go
func (d *model.Dog) Eat(thing string ) string
```
你代码里的 `func (d *model.Dog)` 这种肯定是错误的,这肯定是给其他包添加方法了。所有的方法必定是 `func (d *Dog)` 或者 `func(d Dog)` 两种情况之一。
#3