go 语言 变量命名请教

2021-09-30 10:34:06 +08:00
 chaleaoch
接口 结构体 和 对象 都是一个东西

譬如
authinterface
authstruct
和 auth


一般, 如果只有一个方法的接口可以命名为 auther 这个我知道.

但实际上 并不只有一个方法.

另外 一般 还有譬如 u := user{}
但是如果一个函数比较大 除了 user 之外, 还有其他 u 开头的结构体...


一般大家如何处理这种情况.

我目前是将类型放到变量后面.
2854 次点击
所在节点    Go 编程语言
16 条回复
iRiven
2021-09-30 10:38:02 +08:00
结构体不添加任何描述,接口添加 Ifc 后缀
czyt
2021-09-30 10:39:15 +08:00
没有看懂想要问的是啥。接口可以嵌套。这些可以自由组合。
index90
2021-09-30 10:43:26 +08:00
type Auth interface

type XXAuth struct

auth := XXAuth{}
dcalsky
2021-09-30 11:05:05 +08:00
```
type IFoo interface {}
type Foo struct {}
var foo Foo
```

我觉得“I”大法蛮好的!
masterclock
2021-09-30 11:15:40 +08:00
楼主要么再组织一下语言?
这一段文字,从头到尾没看懂
chaleaoch
2021-09-30 12:55:16 +08:00
@masterclock
@czyt
一楼四楼看懂了.

大概是这个意思.

```
type authInterface interface {
}

type authStruct struct {
}

var authS authStruct = authStruct{}
var authI authInterface = authS
```

我的问题是 这些接口结构体和指向接口结构体的变量如何命名?
qq1340691923
2021-09-30 13:57:29 +08:00
type AuthInterface interface {
}

type Auth struct {
}

auth := Auth {}
var authInterface AuthInterface = auth
chaleaoch
2021-09-30 13:59:15 +08:00
@qq1340691923 大佬想法和我差不多.
但是如果接口定义成 私有的就麻烦了.
index90
2021-09-30 14:59:31 +08:00
在 go 里面,interface 才是面向对象里的“对象”
Jwyt
2021-10-01 02:42:55 +08:00
感觉楼主的问题 Java 写多了就信手拈来了
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()
}
lostsquirrelX
2021-10-02 09:51:28 +08:00
编程思想没转变
chaleaoch
2021-10-02 17:29:13 +08:00
@janxin 谢谢大佬.
chaleaoch
2021-10-02 17:43:14 +08:00
@janxin 大佬还有其他最佳实践分享嘛... 最近写 go 很混乱...
kiripeng
2021-10-03 01:44:42 +08:00
@chaleaoch 原生的 go 本身也是用对于 map 相关的都是 mapInterface 没必要太在意
mcfog
2021-10-03 23:10:10 +08:00
因为 go 的风格是把接口放在调用侧而非实现侧的,所以多数情况接口和实现是在不同 package 中,可以直接用相同的名字

多个方法如果紧密相关可以放一起,起一个整体名字,如果并没有太大相关,可以分开多个接口,go proverb 如是说:

“The bigger the interface, the weaker the abstraction.”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/805346

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX