Golang:接口内的结构?

ste*_*t99 1 go

所以我有一个接口,UserService在包内调用service

我有两个简单的结构来表示 HTTP 调用的主体和响应。我有另一个实现UserService接口的结构。

我想放置这些结构,调用它们UserResponseUserRequest在接口内部,以便其他服务可以使用它们进行 HTTP 调用。此外,请求和响应应该可用(struct UserReponse,不可用struct userResponse),以便代码的其他部分可以使用它们。

我在调用的接口中定义了一个函数 GetUser(request UserRequest) UserResponse

但是,每当我引用时,UserRequest我都必须使用service.UserRequest而不是service.UserService.UserRequest. 这很糟糕,因为我不希望与用户相关的对象进入服务命名空间。我希望每个与服务相关的数据都在其自己的界面、文件等下进行组织。不幸的是,如果我将其UserResponse放入UserService界面中,则会出现错误。所以我把它放在与 相同的级别UserService,这就是为什么它们显示为service.UserResponse. 我如何访问UserResponseas service.UserService.UserResponse

kos*_*tya 5

这里有一个建议,可以用更“惯用”的 Go 方式组织你的代码:

package user

type Request struct {
    ...
}

type Response struct {
    ...
}

type Service interface {
   GetUser(r Request) Response
}
Run Code Online (Sandbox Code Playgroud)

user包外,代码将如下所示:

s := user.NewService()
var req user.Request
var resp user.Response
resp = s.GetUser(req)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,代码使用了更短的名称,但仍然非常具有可读性。

包名称service显示您按层而不是按功能组织应用程序中的代码。我不会推荐它。这是关于它的有趣文章:http : //www.javapractices.com/topic/TopicAction.do?Id=205。它使用 Java,但该原则适用于任何编程语言。