janxin
2021-10-02 08:13:51 +08:00
虽然不是完全 Get 到了 LZ 的点,但是也尝试回答一下
比如接口可以尝试叫做 Auther,那么对应的结构体可以叫做 UserAuth,OpenAPIAuth (这个需要看情况,一般情况这不一定是最佳实践)。变量名则可以是 userAuth,openapiAuth 。当然变量名命名在各种语言都一样,以标记为主,能够直观表达即可,叫做 auth,只要大家理解也无不可。即便循环里大家常用的 i,j,k,约定俗称也就如此用了。
另外关于接口定义的私有化问题多少有点暧昧,一般这种情况下可能是无需定义接口或者接口定义存疑,不如重新思考是否确实需要接口。另外是之前提到的未必最佳实践是指的下面一种关于 Java-esque 的写法的问题就是下面的一种情况:
type IFoo interface{
...
}
type Foo struct{
...
}
这是一种非常 Java-Style 的写法,实际上 Go 中的最佳实现是根据使用者需求定义最小化接口。往往 Javaer 的写法是在结构体旁边声明一个非常庞大的接口,这个结构体是完全实现了这个接口的。
转换成具体的例子可以这样理解:
// 定义时
type Animal interface {
Name() string
Speaks() string
}
// implementation of Animal
type Dog struct{}
func (a Dog) Name() string {
return "Bobby"
}
func (a Dog) Speaks() string {
return "woof"
}
// 使用时
func Perform(a animals.Animal) string {
return a.Speaks()
}