Golang:接口内的struct?

时间:2015-08-12 13:44:37

标签: 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。如何以UserResponse的身份访问service.UserService.UserResponse

2 个答案:

答案 0 :(得分:4)

这是一个建议,以更多"惯用的方式组织您的代码"走吧:

package user

type Request struct {
    ...
}

type Response struct {
    ...
}

type Service interface {
   GetUser(r Request) Response
}

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

s := user.NewService()
var req user.Request
var resp user.Response
resp = s.GetUser(req)

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

service这样的包名称表明您可以按层而不是按功能整理应用中的代码。我不推荐它。这是一篇有趣的文章:http://www.javapractices.com/topic/TopicAction.do?Id=205。它使用Java,但该原则适用于任何编程语言。

答案 1 :(得分:-2)

Go不是Java; Go甚至不是C ++。您应该将Go视为“带接口的C”。

特别是,您无法按照自己的意愿执行操作,因为您无法在接口定义中嵌套结构定义。请注意,您可以嵌套structs inside structs,但不能直接实例化嵌套结构。

您最接近的方法是将每个逻辑对象组移动到自己的包中。