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

go 怎么感觉啥都缺啊,他的定位在哪里

  •  
  •   hzjseasea · 2020-09-03 17:06:00 +08:00 · 18033 次点击
    这是一个创建于 1325 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习 go,想着自己单独写个项目不大行,就去刷 leetcode 了 后面发现 这玩意

    1. 函数没有默认值,不支持重载,
    2. 时间格式化也用的不是 yyyy-MM-dd HH:mm:ss 这样的通用形式
    3. 经常会返回 err 不过我觉得是个好处。 写的我有点懵逼

    有大佬给个定位嘛

    165 条回复    2020-12-01 01:03:12 +08:00
    1  2  
    coderxy
        1
    coderxy  
       2020-09-03 17:19:32 +08:00   ❤️ 2
    2 的话确实是槽点,每次写的时候我都想喷。3 的话一般般吧,虽然确实难用但是官方的说法好像也有道理。 1 的话只能说别拿别的语言的一些特性来要求 go 吧,每个语言设计就是不同的。

    另外说 go 的前景,我觉得除了 java 外在后端领域 go 应该是最有前景的了。
    pigmen
        2
    pigmen  
       2020-09-03 17:21:48 +08:00   ❤️ 1
    确实 每次用时间都想骂,这么随便真的好吗。。
    wellsc
        3
    wellsc  
       2020-09-03 17:22:39 +08:00   ❤️ 14
    空降架构师刷 kpi
    vevlins
        4
    vevlins  
       2020-09-03 17:22:56 +08:00
    c/c++ 易用版
    rimutuyuan
        5
    rimutuyuan  
       2020-09-03 17:23:17 +08:00
    2. 2006 - 01 - 02 15(3): 04:05 612345 时间格式化还是比较好记的

    3. err 除了比较占地方,其他挺好的
    caryqy
        6
    caryqy  
       2020-09-03 17:24:05 +08:00   ❤️ 3
    第二点 只需要记住是 06 年的 然后后面是 1 2 3 4 5, 2006-01-02 15:04:05 我觉得比你说的那个形式好记多了
    Vegetable
        7
    Vegetable  
       2020-09-03 17:24:52 +08:00
    20060102150405 无力吐槽...
    wzw
        8
    wzw  
       2020-09-03 17:29:30 +08:00 via iPhone
    反正越用越喜欢了
    hzjseasea
        9
    hzjseasea  
    OP
       2020-09-03 17:31:10 +08:00
    @pigmen 真的好随便,就感觉这个是他们自家语言一样 太任性了
    hzjseasea
        10
    hzjseasea  
    OP
       2020-09-03 17:33:41 +08:00
    我感觉用来写中间件会好点把,这个要是拿来写 web,会不会全屏都是 if err != nil {} ....
    hzjseasea
        11
    hzjseasea  
    OP
       2020-09-03 17:34:34 +08:00   ❤️ 1
    @coderxy 我感觉用来写中间件会好点把,这个要是拿来写 web,会不会全屏都是 if err != nil {} ....
    bk201
        12
    bk201  
       2020-09-03 17:35:41 +08:00
    @rimutuyuan 这么随意的么...
    Maboroshii
        13
    Maboroshii  
       2020-09-03 17:35:48 +08:00
    我倒是感觉时间格式化很好用。。
    可能是我用的少的原因 MMmm 的大小写我每用一次就要查一次。。
    coderxy
        14
    coderxy  
       2020-09-03 17:36:30 +08:00
    @hzjseasea 很不幸,我们就是拿 go 写的业务, 中型项目。 还行吧,虽然 if err!=nil 多了点,但是还在忍受范围内。
    damngood
        15
    damngood  
       2020-09-03 17:36:33 +08:00 via iPhone
    时间格式不用记
    time 包里面很多预设的 const 值,很多可以直接用,不适合拿过来改一下就好.
    hzjseasea
        16
    hzjseasea  
    OP
       2020-09-03 17:37:04 +08:00
    @wzw 爽是真的爽,这几天下来爽的时候贼开心,碰到有些槽点的时候,就有种说不出的憋屈
    hzjseasea
        17
    hzjseasea  
    OP
       2020-09-03 17:37:48 +08:00
    @caryqy 主要第一种写惯了
    hzjseasea
        18
    hzjseasea  
    OP
       2020-09-03 17:38:17 +08:00
    @wellsc 这应该只是一个梗吧
    kiracyan
        19
    kiracyan  
       2020-09-03 17:38:44 +08:00
    少用 GO 写业务 不然烦死了
    damngood
        20
    damngood  
       2020-09-03 17:40:09 +08:00 via iPhone
    函数没重载确实是个痛点...
    方法签名和参数无关,有点小不爽.
    hzjseasea
        21
    hzjseasea  
    OP
       2020-09-03 17:40:28 +08:00
    @kiracyan 嗯呢一开始学的时候就是打算拿来写组件的,业务后面有需求再用
    zdt3476
        22
    zdt3476  
       2020-09-03 17:44:05 +08:00
    第一点确实开发的时候不够舒服。但是第二点我觉得是优点,非常好记
    securityCoding
        23
    securityCoding  
       2020-09-03 17:46:59 +08:00
    @kiracyan 写写中间件还不错 ,业务的话泛型出来就好了,我一直在等...
    AngryPanda
        24
    AngryPanda  
       2020-09-03 17:48:24 +08:00
    2 这正是你的机会啊小老弟,写个 package 来这里推广。
    fishCatcher
        25
    fishCatcher  
       2020-09-03 17:55:20 +08:00 via iPhone
    用 go 刷 leetcode 本身就是不对的,go 对标的是 c 而不是 cpp
    isayme
        26
    isayme  
       2020-09-03 18:01:10 +08:00
    第 2 个问题提供一个解决思路: 在 docker build 前, 把 $GOROOT/src/time/time.go 里的 MarshalJSON 方法给换掉了. 格式化为 2006-01-02T15:04:05.000Z 这种格式.
    hzjseasea
        27
    hzjseasea  
    OP
       2020-09-03 18:09:41 +08:00
    @fishCatcher 习惯了,学个新的语言都回去刷一会熟悉一下语法 那像 rust 这种对标 CPP 的也很难写 leetcode 啊,链表都很难写。
    mingsz
        28
    mingsz  
       2020-09-03 18:10:39 +08:00
    612345
    hzjseasea
        29
    hzjseasea  
    OP
       2020-09-03 18:11:02 +08:00
    @isayme 好的谢谢,我去试试
    windfarer
        30
    windfarer  
       2020-09-03 18:13:17 +08:00 via Android
    大道至简(狗头
    676529483
        31
    676529483  
       2020-09-03 18:14:23 +08:00
    其实每次写 go 难受的时候,我就回去看看 c/c++,再回来就真香
    cmdOptionKana
        32
    cmdOptionKana  
       2020-09-03 18:17:19 +08:00
    哪个语言是完美的找不出几个槽点?你说的 Go 的这几个问题,有一说一都是小问题,不管做项目还是刷算法,就你举出的这几个问题,有实质性影响吗?

    正好隔壁在骂 swoole,你去看看,都在说转 Go https://v2ex.com/t/703874
    superrichman
        33
    superrichman  
       2020-09-03 18:19:20 +08:00 via iPhone
    被 go 的执行效率吸引,然后被 err 地狱劝退
    kidlj
        34
    kidlj  
       2020-09-03 18:25:36 +08:00   ❤️ 7
    楼上说的有道理。我读过好几篇对比 Go 和其它语言的文章 /评论,包括王垠的那篇,都是找到几个相对审美角度的小问题开始吐槽,这也说明 Go 没什么大的问题。

    Go 社区调查中报告的最想解决的三个问题:

    - 包管理
    - 范型
    - 错误处理

    第一个已经解决了;第二个也快解决了;第三个还在探索。
    hzjseasea
        35
    hzjseasea  
    OP
       2020-09-03 18:26:21 +08:00
    @superrichman 心声!
    SurfaceView
        36
    SurfaceView  
       2020-09-03 18:28:05 +08:00
    你好 其实 go 里面比你说的这 3 个更坑的 更多, 哈哈哈
    SurfaceView
        37
    SurfaceView  
       2020-09-03 18:30:57 +08:00
    -> 接楼上 我说的是实际开发中.
    wzw
        38
    wzw  
       2020-09-03 18:44:56 +08:00 via iPhone
    @superrichman 错误全部管到,不好?
    neoblackcap
        39
    neoblackcap  
       2020-09-03 18:45:00 +08:00
    @hzjseasea 链表还行,你不追求零抽象就还好
    wzw
        40
    wzw  
       2020-09-03 18:46:24 +08:00 via iPhone
    @hzjseasea 世界公平,有好就有坏,看你要什么,go 的优点我喜欢
    neoblackcap
        41
    neoblackcap  
       2020-09-03 18:49:17 +08:00
    @wzw 错误强制检查没什么问题,关键是,你怎么处理错误。有些直接就返回一个字符串,本应该可以处理的没法处理。这个才是最大的槽点。
    关键不是每个 error 都是字符串,有些又是另外的类型。究其原因还是 error 这个接口太弱了,并不好用。
    MrTreasure
        42
    MrTreasure  
       2020-09-03 18:55:54 +08:00
    难用的包管理已经解决了,还解决了 proxy 问题。泛型提上日程了,接下来就是错误处理

    用 go 写开发简单很多,特别是前端过来的同学
    hzjseasea
        43
    hzjseasea  
    OP
       2020-09-03 19:12:37 +08:00 via Android
    @cmdOptionKana 大佬莫激动,go 是个好语言,只是有些地方用的怪怪的
    hzjseasea
        44
    hzjseasea  
    OP
       2020-09-03 19:17:17 +08:00 via Android
    @neoblackcap 对的就是这个问题,写的很憋屈。
    kidlj
        45
    kidlj  
       2020-09-03 19:20:01 +08:00 via iPhone
    补一句,我爱 errlang !❤️
    chenqh
        46
    chenqh  
       2020-09-03 19:22:35 +08:00
    return error 简直了都, 最关键的是 80-90%的 error 都是 return, 那么为什么不学 exception, 默认上抛?
    dalibaxiaoliba
        47
    dalibaxiaoliba  
       2020-09-03 19:37:25 +08:00
    我 C++和 Go 两边切,一直觉得 Go 比较爽,没心智负担
    fishofcat
        48
    fishofcat  
       2020-09-03 19:44:12 +08:00
    go 的确最大的特点就是心智没那么大负担。库的话和 c 差不多,肯定比 c++,java 这些老牌差的多
    pengjay
        49
    pengjay  
       2020-09-03 19:49:58 +08:00
    直接 panic,外面 recover
    ylsc633
        50
    ylsc633  
       2020-09-03 19:54:37 +08:00
    最近做 B 端结算

    多渠道 多数据计算

    启动多个协程 一起处理

    管道塞数据 另一头多协程处理,别提多爽了..

    以前要执行半个小时的 现在 20s 我就执行完了...
    securityCoding
        51
    securityCoding  
       2020-09-03 19:57:18 +08:00
    @ylsc633 优秀 , 话说这个场景有多线程+队列就能处理了吧?
    xcp3555
        52
    xcp3555  
       2020-09-03 20:24:14 +08:00
    我其实一直不觉得 Go 有某些人说的那么好用... 在我看来它只是有自己的特点而已,并不是有什么先进的优势,甚至这些特点也可以成为缺点,毕竟特点是中性的,有特点不代表都是优点。
    zengming00
        53
    zengming00  
       2020-09-03 20:34:09 +08:00
    go 的强硬是为了更好的明天
    stevefan1999
        54
    stevefan1999  
       2020-09-03 21:01:52 +08:00
    @wzw 我和你相反 越用越發現他其實有很多缺陷 越來越噁心了
    stevefan1999
        55
    stevefan1999  
       2020-09-03 21:03:01 +08:00
    首先是 err 其次是 shadowing 再之後就是沒有泛型 和沒有 iterator/generator

    goroutine 的設計也是挺反人類的 這點 rust 做得很好
    stevefan1999
        56
    stevefan1999  
       2020-09-03 21:05:48 +08:00
    *name shadowing 導致了我不能這樣寫
    ```golang
    func (b *Builder) BootstrapClient() (ret *Client, err error) {
    args, err := b.Config.String()
    if err != nil {
    return
    }
    ...
    return
    }
    ```
    這裏的 err 是被重載了 所以如果第二行有 err return 的真 err 依然是 nil
    CoderGeek
        57
    CoderGeek  
       2020-09-03 21:06:05 +08:00
    go 还年轻
    inframe
        58
    inframe  
       2020-09-03 21:16:22 +08:00
    从日常使用角度看,静态语言 go 除了错误处理和泛型,基本上没有结构性的问题了;
    部署上是最大的优点,编译完直接丢上去就可以跑了
    swulling
        59
    swulling  
       2020-09-03 21:20:33 +08:00
    除了错误处理外,其他两个只能说是小问题。那就证明这个语言没啥大问题
    swulling
        60
    swulling  
       2020-09-03 21:21:20 +08:00
    Go 最大的问题还是比较年轻导致生态还需要建设,很多包都没有或者质量不高。
    Macolor21
        61
    Macolor21  
       2020-09-03 21:41:25 +08:00 via iPhone
    @dalibaxiaoliba c++太复杂了
    yxcoder
        62
    yxcoder  
       2020-09-03 21:50:02 +08:00
    Go 的错误处理好像是作者故意为之的。作者受不了现在项目 try catch 乱用
    minami
        63
    minami  
       2020-09-03 21:54:27 +08:00   ❤️ 1
    你站在 C 语言角度看就啥都不缺了,doge
    cmdOptionKana
        64
    cmdOptionKana  
       2020-09-03 21:55:06 +08:00
    @hzjseasea “go 是个好语言,只是有些地方用的怪怪的”

    我想了一下,貌似找不到一个语言用起来不怪的,每个语言都有怪怪的地方……
    catcn
        65
    catcn  
       2020-09-03 21:56:50 +08:00
    @hzjseasea 不会都是 if err!=nil 的,可以包个 recover
    cmdOptionKana
        66
    cmdOptionKana  
       2020-09-03 22:04:08 +08:00
    @yxcoder java 为了弥补 try catch 的缺陷,弄出个 Checked Exception,但也不完美。其实 try catch 那一套如果有强迫症想处理得完美一点,结果麻烦程度和 Go 的 err 也差不多。
    ConradG
        67
    ConradG  
       2020-09-03 22:11:03 +08:00   ❤️ 4
    go 是且只是挂载了一个不错协程库和杂揉了若干不统一语法糖的 extend C
    go 在使用方面最主要的问题之一是为了语法简洁牺牲了太多语义表达能力。和 C 对比的时候问题不大,但和其他常用的高级语言相比,go 的语言抽象能力就是没入门级别的。
    hideokuze
        68
    hideokuze  
       2020-09-03 22:16:32 +08:00 via Android
    定位在容易和有个好爹,要不然 Erlang 更好用(
    firefox12
        69
    firefox12  
       2020-09-03 22:23:10 +08:00
    @ylsc633 这绝对不是 go 牛逼,而是你原来写的太 sb
    reus
        70
    reus  
       2020-09-03 22:39:42 +08:00   ❤️ 1
    yyyy-MM-dd HH:mm:ss 通用?笑死个人,你还是多接触几门语言,多接触几种数据库,再来判断下,是不是通用。

    妈的每次用到这种格式化字符串都要查文档,从来都没有统一的标准,你认为通用,只是你不知道有多少变种而已。
    reus
        71
    reus  
       2020-09-03 22:50:16 +08:00
    @stevefan1999 错,因为 err 已经在返回值定义了,所以 args, err := ... 这行,err 就是指返回的 err,不会覆盖,这种写法完全没问题。如果覆盖的话,编译器直接就报错了。

    不信你自己看: https://play.golang.org/p/vD3nZ95D9-r
    joesonw
        72
    joesonw  
       2020-09-03 22:52:47 +08:00
    @pengjay stack 不要钱的?
    jinliming2
        73
    jinliming2  
       2020-09-03 22:58:10 +08:00
    Go 的时间不是有常量吗?日常用的几种规范都提供常量了啊?
    time.Now().Format(time.RFC3339)
    正常这样就行了啊,要其他格式也都有内置定义。
    需要 HTTP 的时间格式,可以用
    time.Now().Format( http.TimeFormat)
    除非是要非标准的的格式才需要手写……
    reus
        74
    reus  
       2020-09-03 22:59:36 +08:00
    lancelock
        75
    lancelock  
       2020-09-03 23:14:04 +08:00
    我工作用 java,最近用 go 写了一个个人项目(做业务的)。感觉是不太方便,但直接,部署也简单。之前有些功能感觉比较难实现,但后来修修补补也能搞出来。就那样把,感觉还是.net core 更优秀
    wangyzj
        76
    wangyzj  
       2020-09-03 23:22:15 +08:00
    哈哈哈,几乎没啥轮子
    各种奇葩设计
    需要习惯一下下下下下下下下下下下下下下下
    upupddd
        77
    upupddd  
       2020-09-03 23:23:56 +08:00 via iPhone   ❤️ 1
    scala 路过
    j2gg0s
        78
    j2gg0s  
       2020-09-03 23:24:08 +08:00
    吐槽都吐槽不到点上,时间的通用型式,
    通用是哪个标准下的通用
    rfc3339?ios 8601?还是设计的通用时间格式? :dog
    hzjseasea
        79
    hzjseasea  
    OP
       2020-09-03 23:37:24 +08:00
    @cmdOptionKana 大佬莫激动 ,go 是个好语言,用起来真的爽,只是有些地方写着写着有点迷,但细想他这样的设计也的确有他的道理
    @cmdOptionKana 那可能个人使用上不同的把 我觉得 python java .net 这些都蛮正常的,rust 虽然复杂了点,但写起来也蛮舒服的
    hzjseasea
        80
    hzjseasea  
    OP
       2020-09-03 23:38:34 +08:00
    @catcn 谢谢 我去看看这方面的
    crclz
        81
    crclz  
       2020-09-03 23:39:45 +08:00   ❤️ 1
    go 缺 java 的特性。java 和 c#都发展成非常相似的样子; spring 和 asp.net 也发展成非常相似的样子。这就说明,webapp 的框架和语言的最优解已经收敛到了 spring 和 asp.net 附近。
    hzjseasea
        82
    hzjseasea  
    OP
       2020-09-03 23:39:45 +08:00
    @reus 可以举例几个嘛,至少我写过的几个都是这种形式的
    buffzty
        83
    buffzty  
       2020-09-04 02:35:16 +08:00
    1. 我觉得挺好的,java 功能太多 封装太严重我很不喜欢. 再说了可以弄默认值的 你不会而已
    2. 2006 01 02 15:04:05 很好记
    3. 跟 c 语言处理方式一模一样 哪来的懵逼
    这三个都不是坑 泛型才是最急的
    ccav
        84
    ccav  
       2020-09-04 02:41:17 +08:00
    从 0.9 等泛型等到 2.0~~

    无 runtime 还是太方便了.
    reus
        85
    reus  
       2020-09-04 02:41:59 +08:00
    @hzjseasea 形式是一样,但有的用 yyyy,有的用 YYYY,有的用 MM,有的用 mm,你难道还要一个个记住? go 的根本不用记,就是 123456
    jhdxr
        86
    jhdxr  
       2020-09-04 04:49:35 +08:00
    go 也就大陆用的多。。。

    回过头来还是得要么 java,要么 rust/c/c++
    wzw
        87
    wzw  
       2020-09-04 05:43:31 +08:00 via iPhone
    @stevefan1999 你用 rust ?
    fox0001
        88
    fox0001  
       2020-09-04 06:54:03 +08:00 via Android
    @chenqh #46 记得是出于性能的考虑。抛 exception 很占资源
    admirez
        89
    admirez  
       2020-09-04 08:00:23 +08:00
    go 本来可以大发展的,但是这个时间格式就看出来小格局了
    chengxiao
        90
    chengxiao  
       2020-09-04 08:21:14 +08:00
    @reus 拉倒吧 确实不用记 每次用我都得去查一次~
    p1gd0g
        91
    p1gd0g  
       2020-09-04 09:19:26 +08:00
    shadowed error 也有人吐槽。
    把定义在返回值里的 error 挪到函数里不就解决了~
    securityCoding
        92
    securityCoding  
       2020-09-04 09:41:30 +08:00
    @p1gd0g 没理解挪到函数 , 方便贴个代码吗?
    anjianshi
        93
    anjianshi  
       2020-09-04 09:47:06 +08:00
    只有我想吐槽 go 官方推荐用 tab 做缩进吗.... 明明主流都倾向空格,且空格兼容性更好
    tikazyq
        94
    tikazyq  
       2020-09-04 09:54:20 +08:00   ❤️ 1
    golang 简单,上手快,天生并发,这点优势 java 还是略欠缺。话说大家为啥不用.Net ,个人觉得比 java 香
    vone
        95
    vone  
       2020-09-04 10:03:57 +08:00   ❤️ 1
    .NET 天下第一
    CodeCodeStudy
        96
    CodeCodeStudy  
       2020-09-04 10:04:53 +08:00
    @reus 小时为什么用 15,而不是 03 ?
    huiyifyj
        97
    huiyifyj  
       2020-09-04 10:08:35 +08:00
    @coderxy #14
    if err!=nil 实在是太多了,蛋疼的错误处理😭
    mshadow
        98
    mshadow  
       2020-09-04 10:19:40 +08:00
    @reus yyyy-MM-dd HH:mm:ss 是 ISO 标准
    Pythondr
        99
    Pythondr  
       2020-09-04 10:21:53 +08:00
    @CodeCodeStudy 15 是 24h 制,03 是 12h 制
    ytll21
        100
    ytll21  
       2020-09-04 10:24:12 +08:00
    go 只是好学门槛低,说到可玩性,rust 能甩出它 10 条街。。。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2801 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:03 · PVG 18:03 · LAX 03:03 · JFK 06:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.