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

Go 里面是否推荐将同一组用途的函数用结构体串起来?

  •  
  •   qW7bo2FbzbC0 · 2020-05-03 16:41:30 +08:00 · 3019 次点击
    这是一个创建于 1699 天前的主题,其中的信息可能已经有所发展或是发生改变。

    方式 1:

    struct TUtils struct {}

    func (t TUtils) GetNowBejingTime() {}

    func (t TUtils) GetLastDaySecondsTotal() {}

    方式 2:

    func GetNowBejingTime() {}

    func GetLastDaySecondsTotal() {}

    另: 方式 1 是否等同于面向对象中的静态方法?

    22 条回复    2020-05-04 08:49:29 +08:00
    pwli
        1
    pwli  
       2020-05-03 16:48:19 +08:00 via Android
    没有数据的结构体,要他有何用😂
    qW7bo2FbzbC0
        2
    qW7bo2FbzbC0  
    OP
       2020-05-03 16:49:42 +08:00
    @pwli 像烤串的签子一样,组织代码,显得不那么零散?
    pwli
        3
    pwli  
       2020-05-03 16:54:56 +08:00 via Android
    @hjahgdthab750 感觉把这些 func 直接放到一个 package 也能“串”起来
    reus
        4
    reus  
       2020-05-03 17:08:49 +08:00
    当然不。可以用另一个包。
    Hanggi
        5
    Hanggi  
       2020-05-03 17:09:37 +08:00
    对啊,为什么不用 package 呢?
    hactrox
        6
    hactrox  
       2020-05-03 17:16:50 +08:00
    我觉得方式一的关键在于有 struct 要组织,然后围绕它需要有一些方法,这样刚好也组织了一组函数,核心在于有一些 field 需要组成 struct 来进行管理。如果不是这个需求,个人觉得更适合的是创建一个独立的 package,然后方式二,有种 util package 的感觉。
    xiadada
        7
    xiadada  
       2020-05-03 17:25:05 +08:00 via iPhone
    方式一纯属脱裤子放屁,纯属。
    Trim21
        8
    Trim21  
       2020-05-03 17:29:57 +08:00
    实际调用的时候:

    上面:Tutils.TUtils{}.Get()
    下面:TUtils.Get()
    Mohanson
        9
    Mohanson  
       2020-05-03 17:30:01 +08:00
    赞同 1 楼, 结构体是一种复合数据结构, 重点是"数据结构", 而不是"包", "模块", "命名空间" 一类的...
    qW7bo2FbzbC0
        10
    qW7bo2FbzbC0  
    OP
       2020-05-03 17:31:21 +08:00
    感谢各位
    Mohanson
        11
    Mohanson  
       2020-05-03 17:31:25 +08:00
    你需要的可能是命名空间, 那么 go 中唯一可以使用的就是 package 组织.
    fixend
        12
    fixend  
       2020-05-03 18:04:13 +08:00 via Android
    一,二我都用。
    二适合做 util,缺点是项目大了,包数量太多。
    一适合包内部用,不对外。做成单例模式,通过一个全局对象访问,避免大量全局的函数。
    freestyle
        13
    freestyle  
       2020-05-03 18:08:46 +08:00 via iPhone
    var TUtils = struct {
    GetNowBejingTime func(){}
    } {

    GetNowBejingTime: func(){
    }
    }
    qW7bo2FbzbC0
        14
    qW7bo2FbzbC0  
    OP
       2020-05-03 18:16:00 +08:00
    @freestyle 这个用法我还是头一次遇到,比较有意思,但是这种应该是需要实例化吧。OOP 的静态方法是我想要的形式
    liuxu
        15
    liuxu  
       2020-05-03 18:36:26 +08:00   ❤️ 1
    建议直接用包,用了 struct 反而不干净了

    例如 OpenFile 这类与文件相关的方法只用于文件,所以用 func (*f File) Open(){}让包更干净,用 OpenFile(f File)会让包变得臃肿

    但是你这个例子是希望组合一批有某类关联操作的函数,包里没有混合其他结构,所以直接用包更干净
    Hellert
        16
    Hellert  
       2020-05-03 19:00:20 +08:00 via Android
    可以参考 strings 包,字符串相关函数都放这个包里。
    freestyle
        17
    freestyle  
       2020-05-03 20:05:00 +08:00 via iPhone
    @hjahgdthab750 已经是 var 了,可直接访问匿名结构体里的成员. 包内太多相关的全局变量时会用,收拢 function options 常用. 如:https://github.com/go-stomp/stomp/blob/master/subscribe_options.go
    useben
        18
    useben  
       2020-05-03 21:04:24 +08:00
    结构体并不是为了串起函数,而是为了面向对象,面向接口设计。别搞混了主次
    qW7bo2FbzbC0
        19
    qW7bo2FbzbC0  
    OP
       2020-05-03 21:09:58 +08:00
    @useben 嗯,我是想模拟面向对象中静态类的静态方法
    rayhy
        20
    rayhy  
       2020-05-03 21:40:06 +08:00 via Android
    写 golang 时,我对 util 避讳程度堪比 import 路径里有 src
    zjyl1994
        21
    zjyl1994  
       2020-05-04 00:23:09 +08:00
    别把,你弄个 package 不行么?没有数据的 struct 叫什么 struct 。
    tqz
        22
    tqz  
       2020-05-04 08:49:29 +08:00 via Android
    确实有这种推荐,在《 go 语言学习笔记》中提到:给同一用途的函数定义函数类型,这样可以让相同签名的函数自动实现某个接口
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:40 · PVG 17:40 · LAX 01:40 · JFK 04:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.