V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
chaleaoch
V2EX  ›  Go 编程语言

go 语言 变量命名请教

  •  
  •   chaleaoch · 2021-09-30 10:34:06 +08:00 · 2843 次点击
    这是一个创建于 1135 天前的主题,其中的信息可能已经有所发展或是发生改变。
    接口 结构体 和 对象 都是一个东西

    譬如
    authinterface
    authstruct
    和 auth


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

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

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


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

    我目前是将类型放到变量后面.
    16 条回复    2021-10-03 23:10:10 +08:00
    iRiven
        1
    iRiven  
       2021-09-30 10:38:02 +08:00 via Android
    结构体不添加任何描述,接口添加 Ifc 后缀
    czyt
        2
    czyt  
       2021-09-30 10:39:15 +08:00
    没有看懂想要问的是啥。接口可以嵌套。这些可以自由组合。
    index90
        3
    index90  
       2021-09-30 10:43:26 +08:00   ❤️ 1
    type Auth interface

    type XXAuth struct

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

    我觉得“I”大法蛮好的!
    masterclock
        5
    masterclock  
       2021-09-30 11:15:40 +08:00   ❤️ 4
    楼主要么再组织一下语言?
    这一段文字,从头到尾没看懂
    chaleaoch
        6
    chaleaoch  
    OP
       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
        7
    qq1340691923  
       2021-09-30 13:57:29 +08:00
    type AuthInterface interface {
    }

    type Auth struct {
    }

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

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

    “The bigger the interface, the weaker the abstraction.”
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   987 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:09 · PVG 06:09 · LAX 14:09 · JFK 17:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.