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

初学 go 语言,经常看到有网友说某某 go 代码一股 Java 味

  •  
  •   hihanley · 2020-12-16 20:31:40 +08:00 · 10128 次点击
    这是一个创建于 1436 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小白想问问:

    1. 为什么说他一股 java 味
    2. 什么样的 go 代码是优雅的、好的
    第 1 条附言  ·  2020-12-17 16:24:14 +08:00
    我是菜鸟 Java, .NET Core 开发,并无语言鄙视链的意思。

    看完大家的回复,我总结"Java 味"可能是以下几点:
    1. 为了设计而设计。
    2. 过度封装。
    3. 将 Java 的代码规范、命名风格套用到其他语言。

    大佬推荐的 Go 语言风格:
    https://golang.org/doc/effective_go.html
    https://github.com/uber-go/guide/blob/master/style.md
    85 条回复    2021-05-11 15:31:37 +08:00
    Cbdy
        1
    Cbdy  
       2020-12-16 20:49:34 +08:00
    啥是 Java 味?
    learningman
        2
    learningman  
       2020-12-16 20:50:31 +08:00
    借宝地一问,上次看到一人说 Go 是云计算的 PHP,略感迷惑,求解
    DEVN
        3
    DEVN  
       2020-12-16 20:51:31 +08:00
    Java 味咋了?
    Leigg
        4
    Leigg  
       2020-12-16 20:55:10 +08:00 via iPhone
    什么是好的?只有原则,没有标准,最基本的,按照 go 的代码规范,命名风格来开发。
    hihanley
        5
    hihanley  
    OP
       2020-12-16 21:02:33 +08:00
    hihanley
        6
    hihanley  
    OP
       2020-12-16 21:03:39 +08:00
    @Cbdy @DEVN
    我也没太明白,我是 Java,.net core 开发,初学 go,现在甚至连 go demo 都写不出来
    cmdOptionKana
        7
    cmdOptionKana  
       2020-12-16 21:18:31 +08:00   ❤️ 2
    Java 是咖啡味
    lululau
        8
    lululau  
       2020-12-16 21:24:30 +08:00   ❤️ 2
    典型的 Java 味: 所有的类(类型)全部由一对 IXXX 和 XXXImpl 组成
    TypeError
        9
    TypeError  
       2020-12-16 21:26:33 +08:00 via Android   ❤️ 2
    https://golang.org/doc/effective_go.html
    https://github.com/uber-go/guide/blob/master/style.md
    go 风格的看这些差不多了

    Java 味我感觉就是过度封装,没高阶函数导致滥用设计模式
    Greatshu
        10
    Greatshu  
       2020-12-16 21:26:54 +08:00
    给 golang 倒杯卡布奇诺
    kidlj
        11
    kidlj  
       2020-12-16 21:47:13 +08:00   ❤️ 1
    别写 Factory, Impl, Service, Repository etc. hehe
    undeflife
        12
    undeflife  
       2020-12-16 21:49:21 +08:00
    golang 这种基本上几乎完全没有 oo 特性的语言,除了文件命名,怎么可能写出 java 味来?
    dilu
        13
    dilu  
       2020-12-16 21:52:14 +08:00 via Android
    这个网友怕根本不会 java 吧?就随便听说个名词就来了?
    go 更像 c,但是相对比 c 简单。开发成本上更接近 PHP,但是性能比 PHP 好很多。目前 go 还是吹的多,生态感觉还是很一般的。
    hihanley
        14
    hihanley  
    OP
       2020-12-17 00:53:04 +08:00
    @TypeError 好的大佬,看完语法我就看看这些
    hoyixi
        15
    hoyixi  
       2020-12-17 00:59:09 +08:00
    接口?链式调用?
    没觉得 go 优雅,我觉得说它优雅,是比 C++优雅~

    个人觉得 Ruby 语法能算得上优雅,而且,许多其它编程语言这几年的演进,都多少有点学 Ruby 语法的意思。但是 Ruby 写出来的代码又太灵活多样。代码成品+语法整体上,还是不够优雅。

    希望有真正优雅的编程语言出现~
    dawn009
        16
    dawn009  
       2020-12-17 01:30:30 +08:00   ❤️ 2
    使用多种编程语言的人,通常都会融合从各个语言里学到的好的编程思想,所以看起来“味”就不那么“纯”?
    chenqh
        17
    chenqh  
       2020-12-17 03:05:58 +08:00
    说他是 php,是说他有些设计真的很恶心,但是火的快呀
    fengchang
        18
    fengchang  
       2020-12-17 04:19:36 +08:00
    我见过 Java 味儿的 PHP,每个 class 都要带个 interface,class 里的每个属性都要手写 getter 和 setter,再加上一个自己仿的 Hibernate
    littlecreek
        19
    littlecreek  
       2020-12-17 04:26:59 +08:00   ❤️ 6
    说是 Java 味, 不如说是被各大公司的 Java 编程规范带偏了的 Java 代码 /设计风格.
    前面有人也提过, 比如:
    1. 各种过度设计. (各种 Impl, 各种 Factory, 各种 Manager)
    2. 函数 /变量名字超长
    3. 调用栈超级深, 很多没用的封装
    4. 还有别的补充吗?
    Weixiao0725
        20
    Weixiao0725  
       2020-12-17 06:31:24 +08:00
    @dilu 不吹,谁去建设生态
    goophy
        21
    goophy  
       2020-12-17 07:31:53 +08:00 via iPhone
    比如下面?
    ```
    func (this *Model) Foo() {
    this.Name .....
    ....
    }
    ```
    zjsxwc
        22
    zjsxwc  
       2020-12-17 08:07:50 +08:00 via Android
    什么是 java 味?

    - 所有文件都有 impl 命名实现与对应的 interface
    - 用 dao 命名数据库操作
    吗?
    hafuhafu
        23
    hafuhafu  
       2020-12-17 08:19:34 +08:00   ❤️ 1
    接口和实现类也算 过渡设计 吗?
    zengming00
        24
    zengming00  
       2020-12-17 08:37:55 +08:00
    java 味最恶心的地方是各种注解,你不学一遍这个框架都不知道是啥意思
    ly020044
        25
    ly020044  
       2020-12-17 08:42:21 +08:00
    gopher 大军和 javaer 大军要开始了
    2379920898
        26
    2379920898  
       2020-12-17 08:54:08 +08:00
    java 算个屁,我 GO 语言天下第一
    acmore
        27
    acmore  
       2020-12-17 08:54:47 +08:00
    当一小撮人不搞无聊的价值观和立场对立的时候
    就是国内计算机真的崛起的时候
    sonxzjw
        28
    sonxzjw  
       2020-12-17 09:00:18 +08:00
    人家说的是 [某某 go 代码] ,可能某某用 go 模拟写 java 吧。
    何必在意这些鸡毛蒜皮的事呢
    leeg810312
        29
    leeg810312  
       2020-12-17 09:01:06 +08:00 via Android
    @hafuhafu 有时候就是写个项目中用的小工具,不套那些大中型项目的设计模式 1000 行代码差不多了,但是创建的人也整个全套 interface/impl/model/dao/repo/service,多了几倍的文件和代码
    sagaxu
        30
    sagaxu  
       2020-12-17 09:03:38 +08:00 via Android
    @hafuhafu 如果绝大多数接口预期只有一个实现,那不是过渡设计是什么?
    FreeEx
        31
    FreeEx  
       2020-12-17 09:21:56 +08:00   ❤️ 2
    上来先整一个 src 文件夹用于放 go 代码,可能是 Javaer 的风格。
    其实不需要的。
    Winchey
        32
    Winchey  
       2020-12-17 09:23:26 +08:00
    等我有钱了,一定要买个能闻味道的电脑
    violence123456
        33
    violence123456  
       2020-12-17 09:32:22 +08:00 via iPhone
    @littlecreek 说的太对了,我今年刚看了 java 和 springboot 就这种感觉。。。
    lewis89
        34
    lewis89  
       2020-12-17 09:42:03 +08:00
    @FreeEx #31 额.. 资源文件混在一起 大项目几十个文件夹跟项目 还有各种配置 上万个文件 混在一起不是人都傻了。
    cco
        35
    cco  
       2020-12-17 09:42:25 +08:00
    @FreeEx 这没啥吧。src 代表源码,pkg,bin 也不也有么。。
    lewis89
        36
    lewis89  
       2020-12-17 09:44:02 +08:00
    什么时候连接口跟实现隔离的设计都成过度设计了? 各位软件工程是不是白学了..
    DomonLee
        37
    DomonLee  
       2020-12-17 09:44:54 +08:00
    JAVA 味道到底是什么?
    zhady009
        38
    zhady009  
       2020-12-17 09:53:05 +08:00
    @sagaxu 只用 jdk proxy 就要接口 没啥毛病
    lower
        39
    lower  
       2020-12-17 09:55:41 +08:00
    记得有个开源项目,用 go 把 Spring 那一套实现了一遍……
    zarte
        40
    zarte  
       2020-12-17 09:56:05 +08:00
    javer 写啥语言都爱整 java 那一套特烦人,之前在论坛发过帖子说 php 整 java 那套的,一堆人怼我说是正确做法,维护性高。
    sharpy
        41
    sharpy  
       2020-12-17 09:58:52 +08:00
    @learningman 当初学 go 的时候,说的是云计算的 c
    lostpg
        42
    lostpg  
       2020-12-17 10:11:40 +08:00 via Android
    @cco 不是一个东西,go 的 src 是 gopath 时代用来存放所有 golang 的源码库的文件夹,和 src 文件夹平级的 pkg 和 bin 分别存放依赖和编译生成。一个源码库里面理论上不出现 src 文件夹,直接以 package 的形式区分。
    guyeu
        43
    guyeu  
       2020-12-17 10:17:07 +08:00
    主要写 java 也写过 go,真想学一下咋把 go 写出 java 味。。
    anonydmer
        44
    anonydmer  
       2020-12-17 10:22:40 +08:00
    @lewis89 #36, 没写过测试代码都这样,没必要跟他们急
    itskingname
        45
    itskingname  
       2020-12-17 10:31:17 +08:00   ❤️ 3
    写 Java 的人转 Python,写出来的 Python 代码也是一股浓浓的 Java 味。

    所谓 Java 味,就是明明一两个文件就能写完的逻辑,非要嵌套十几而是层文件夹,例如,你发下有一个人写的 Go 代码是这样的:

    com/xxx/yyy/zzz/mm/impl/abc.go
    com/aaa/bbb/ccc/ddd/eee/fff/xyz.go

    这就叫做 Java 味。

    还有一种是大量使用 get/set 。当我们用 Go 初始化一个已知数据的数据的时候,一般这样写:

    a := []string{"aaa", "bbb", "ccc"}

    但是 Java 味会这样写:

    var a []string
    a = append(a, "aaa")
    a = append(a, "bbb")
    a = append(a, "ccc")
    namelosw
        46
    namelosw  
       2020-12-17 10:54:21 +08:00 via iPad
    Java 味不光在 Go 常见,在哪都常见,典型的就是到处糊设计模式。

    设计模式是语言缺陷的体现,换了个语言很多时候就不需要某些设计模式了。比如有 multi methods 就很少需要 visitor 了,但是有的人还跑过来一个劲地写 visitor,这就是所谓的某种‘味’。
    Suddoo
        47
    Suddoo  
       2020-12-17 10:59:50 +08:00
    直接写 go func 就行了,非要搞个空 struct,然后把方法写到这个空 struct 下
    huayumo
        48
    huayumo  
       2020-12-17 11:10:26 +08:00
    程序能跑,能赚钱,管他什么语言,管他优雅不优雅,哪怕是中文写的函数呢
    learningman
        49
    learningman  
       2020-12-17 11:13:36 +08:00
    @zengming00 都一样,C 的 enum 也恶心
    whyso
        50
    whyso  
       2020-12-17 11:21:21 +08:00
    我见过一段变量名以$开头的代码,这是不是 PHP 味的?
    huobazi
        51
    huobazi  
       2020-12-17 11:23:28 +08:00
    我就喜欢看大家各种抬杠 O(∩_∩)O 哈哈~
    bzw875
        52
    bzw875  
       2020-12-17 11:24:17 +08:00
    借楼问一下,macos 没有管理员权限下安装 go lang
    tinyuu
        53
    tinyuu  
       2020-12-17 11:27:42 +08:00
    对 java 是异教徒 ,大家回到 1996 去干掉异教徒,发布 1996 go 。
    baozijun
        54
    baozijun  
       2020-12-17 11:38:14 +08:00
    @itskingname #44 java 是这样写 String[] a = new String[]{"aaa","bbb","ccc"};万物皆对象. java 也没有切片,数据直接赋值即可.能不能找点编程语言非共通的点来黑呢.
    baozijun
        55
    baozijun  
       2020-12-17 11:39:55 +08:00
    @acmore #26 大佬是不屑于讨论这些的.你在这里看到的回复可能(应该)100%都是菜鸟(包括我)
    charlie21
        56
    charlie21  
       2020-12-17 12:18:15 +08:00
    @itskingname 这个是按行数算 KPI 工作绩效的吧
    dk7952638
        57
    dk7952638  
       2020-12-17 12:52:32 +08:00
    某些人对自己理解不了的事情或驾驭不了的技能都会扣上各种帽子,比如说 XX 味
    decimalbell
        58
    decimalbell  
       2020-12-17 13:01:59 +08:00
    @lewis89 正解
    decimalbell
        59
    decimalbell  
       2020-12-17 13:04:07 +08:00
    @sagaxu 预期只有一个实现的主要原因是不写测试
    bk201
        60
    bk201  
       2020-12-17 13:05:58 +08:00
    优雅又不能当饭吃,你搞个私人项目随你怎么优雅
    hantsy
        61
    hantsy  
       2020-12-17 13:11:07 +08:00
    go 代码一股 PHP 4 味道,为产屎山代码创造了条件。
    no1xsyzy
        62
    no1xsyzy  
       2020-12-17 13:14:38 +08:00   ❤️ 3
    @bk201 优雅大概是能当饭吃的,不然代码格式化和动态语言的静态检查也卖不出一年几十刀的价格。
    hantsy
        63
    hantsy  
       2020-12-17 13:16:34 +08:00   ❤️ 1
    @bk201 私人代码随便怎么玩都是没有问题的,这是必须的没错。

    问题是,一旦优雅的代码成了工作要求的一部分,你怎么办?写屎山代码容易,写良好设计,结构上优雅的,可维护的代码很难。

    敏捷有一条是产出 Workable,而不是你在机器上 Runnable 。

    如果最基本要求代码优雅,会当成笑柄,我觉得才是问题。
    zxjunz
        64
    zxjunz  
       2020-12-17 13:24:42 +08:00 via Android
    java 味儿,就是纯粹的面向对象,没有语法糖导致不得不写一堆又臭又长的无效代码
    bk201
        65
    bk201  
       2020-12-17 13:24:50 +08:00
    @hantsy
    @no1xsyzy po 主的优雅可能与 2 位的不一致。也有可能是我理解有问题。我感觉他就是再说语法糖
    hantsy
        66
    hantsy  
       2020-12-17 13:25:00 +08:00   ❤️ 1
    @no1xsyzy 优雅的代码当然可以当饭,必须遇到懂的人。就如结婚件事,在农村结婚,80%的人只是搭伙过日子。喜欢混日子的人,只是觉清理代码浪费了时间。

    对于现代软件工程,代码质量检测已经是 CI 和 CD 的一个环节(步骤),包括动态和静态检测,现在有些云工具支持 AI 检测,不仅是一些规则,语法之类,一些啰嗦或者有安全问题,性能问题的代码一样会检测出来。很难想像现在还有人喷这些东西。
    huobazi
        67
    huobazi  
       2020-12-17 13:25:36 +08:00
    @fengchang 在 php 里看见 getter setter 这下我真受不了
    itskingname
        68
    itskingname  
       2020-12-17 13:47:15 +08:00
    @baozijun 那可能你遇到的人比较资深。我看到的 Java 工程师都是先创建一个空对象,然后一个一个赋值,可能是我举得例子不好。他们主要是操作 Hash 的时候会这样做。不是数组。
    jasonkayzk
        69
    jasonkayzk  
       2020-12-17 13:55:20 +08:00   ❤️ 2
    可能是因为类似于下面的代码写少了:
    if err != nil {
    ....
    }
    huruwo
        70
    huruwo  
       2020-12-17 14:01:56 +08:00
    鄙视链又来了 好起来了
    zunceng
        71
    zunceng  
       2020-12-17 14:07:31 +08:00   ❤️ 1
    我见过 Golang 这样写的
    if "" == varA {
    }
    feast
        72
    feast  
       2020-12-17 14:17:25 +08:00
    所谓“Java 味”实际上就是类似所有 Object 型编程语言的意思
    z4oSkDNGGC2svsix
        73
    z4oSkDNGGC2svsix  
       2020-12-17 15:13:35 +08:00
    @learningman 经常有人吐槽 go 的语法难看。。。
    qiuhang
        74
    qiuhang  
       2020-12-17 15:31:27 +08:00
    要说"味道"的话,其实 go 的 C 语言味和 python 味比较浓,但你要说 java 味的话......那不是语言有 java 味,是人有 java 味。
    jeremaihloo
        75
    jeremaihloo  
       2020-12-17 15:38:46 +08:00   ❤️ 1
    楼上很多人理解错了呀

    这句化的意思是说有人写 golang 写的一股 java 的代码风格和味道

    就好比你写 python 却用 java 那套思想,就不够 pythonic
    yamasa
        76
    yamasa  
       2020-12-17 17:34:46 +08:00
    @itskingname 马上都 1202 年了,上个 jdk11 用个 Map.of()不过分吧,就算是 8 也有 ImmutableMap.of()啊?你真确定这是语言的问题,不是人的问题?同样的 arr,不就 List.of().toArray()的事儿?
    itskingname
        77
    itskingname  
       2020-12-17 18:30:09 +08:00   ❤️ 1
    @yamasa 显然是人的问题。优秀的人切换语言以后,会用新语言的开发方式和风格。平庸的人会继续保留老代码的风格,不愿意学习新的东西。
    yamasa
        78
    yamasa  
       2020-12-17 18:39:49 +08:00 via Android
    @itskingname 即便是 java 自己,这几年的风格也是比较激进的,很多语法糖有了,很多以前泛滥的 dp 也不需要了,fp 也有了(虽然相对残废),reactive 也有了,无非是懒不懒愿不愿意学的问题。再出一个 lts 之后,如果 loom 和 vahalla 都进了,那就更不一样了。
    好多人就是懒加不思考。就比如上面吐槽的 setter 泛滥和 map 一通 put 的问题,不客气一点就是彩笔,什么是 immutable 的什么是 stateful 的分不清,连最基本的封装思想都没有。这锅根本不该 java 背。
    懒人用什么语言写出来都烂,无非是语言本身的门槛不一样。让懒人上 rust 怕是连编译都搞不定。
    JaguarJack
        79
    JaguarJack  
       2020-12-17 18:52:57 +08:00
    PHP 是最好的语言!结贴
    YouLMAO
        80
    YouLMAO  
       2020-12-17 20:33:57 +08:00
    我的代码都合到 Apache 顶级项目了, 你管我什么味道, 就是大师的味道
    yannxia
        82
    yannxia  
       2020-12-17 21:18:47 +08:00
    一个主要基于 Path 的语言 + 半残废的 OOP,怎么能写出 Java 味,再下想学习
    Desiree
        83
    Desiree  
       2020-12-17 21:58:01 +08:00
    java 还有味道的吗?
    mamahaha
        84
    mamahaha  
       2020-12-18 11:02:11 +08:00   ❤️ 2
    go 没有类,没有泛型,你却要以某种技巧模拟出这些东西来,应该就是这个意思。如果模拟 Java 的一些特色,就是 Java 味。
    darklowly
        85
    darklowly  
       2021-05-11 15:31:37 +08:00
    楼上的说的差不多了,补充一点:

    在项目模块分解的时候,go 语言一般按功能分,java 一般按类型分。

    例如,java 的 model 包含项目中所有的模型。golang 一般是按用户模块,交易模块这么分。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1232 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:24 · PVG 07:24 · LAX 15:24 · JFK 18:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.