The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
hihanley

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

  •  
  •   hihanley · Dec 16, 2020 · 11464 views
    This topic created in 2147 days ago, the information mentioned may be changed or developed.

    小白想问问:

    1. 为什么说他一股 java 味
    2. 什么样的 go 代码是优雅的、好的
    Supplement 1  ·  Dec 17, 2020
    我是菜鸟 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 replies  •  2021-05-11 15:31:37 +08:00
    Cbdy
    Cbdy
    Dec 16, 2020
    1
    啥是 Java 味?
    learningman
    learningman
    Dec 16, 2020
    2
    借宝地一问,上次看到一人说 Go 是云计算的 PHP,略感迷惑,求解
    DEVN
    DEVN
    Dec 16, 2020
    3
    Java 味咋了?
    Leigg
    Leigg
    Dec 16, 2020 via iPhone
    4
    什么是好的?只有原则,没有标准,最基本的,按照 go 的代码规范,命名风格来开发。
    hihanley
    hihanley
    OP
    Dec 16, 2020
    5
    hihanley
    hihanley
    OP
    Dec 16, 2020
    6
    @Cbdy @DEVN
    我也没太明白,我是 Java,.net core 开发,初学 go,现在甚至连 go demo 都写不出来
    QingXuJiaZhi
    QingXuJiaZhi
    Dec 16, 2020❤️2
    7
    Java 是咖啡味
    lululau
    lululau
    Dec 16, 2020❤️2
    8
    典型的 Java 味: 所有的类(类型)全部由一对 IXXX 和 XXXImpl 组成
    TypeError
    TypeError
    Dec 16, 2020 via Android❤️2
    9
    https://golang.org/doc/effective_go.html
    https://github.com/uber-go/guide/blob/master/style.md
    go 风格的看这些差不多了

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

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

    希望有真正优雅的编程语言出现~
    dawn009
    dawn009
    Dec 17, 2020❤️2
    16
    使用多种编程语言的人,通常都会融合从各个语言里学到的好的编程思想,所以看起来“味”就不那么“纯”?
    simple2025
    simple2025
    Dec 17, 2020
    17
    说他是 php,是说他有些设计真的很恶心,但是火的快呀
    fengchang
    fengchang
    Dec 17, 2020
    18
    我见过 Java 味儿的 PHP,每个 class 都要带个 interface,class 里的每个属性都要手写 getter 和 setter,再加上一个自己仿的 Hibernate
    littlecreek
    littlecreek
    Dec 17, 2020❤️6
    19
    说是 Java 味, 不如说是被各大公司的 Java 编程规范带偏了的 Java 代码 /设计风格.
    前面有人也提过, 比如:
    1. 各种过度设计. (各种 Impl, 各种 Factory, 各种 Manager)
    2. 函数 /变量名字超长
    3. 调用栈超级深, 很多没用的封装
    4. 还有别的补充吗?
    Weixiao0725
    Weixiao0725
    Dec 17, 2020
    20
    @dilu 不吹,谁去建设生态
    goophy
    goophy
    Dec 17, 2020 via iPhone
    21
    比如下面?
    ```
    func (this *Model) Foo() {
    this.Name .....
    ....
    }
    ```
    zjsxwc
    zjsxwc
    Dec 17, 2020 via Android
    22
    什么是 java 味?
    是
    - 所有文件都有 impl 命名实现与对应的 interface
    - 用 dao 命名数据库操作
    吗?
    hafuhafu
    hafuhafu
    Dec 17, 2020❤️1
    23
    接口和实现类也算 过渡设计 吗?
    zengming00
    zengming00
    Dec 17, 2020
    24
    java 味最恶心的地方是各种注解,你不学一遍这个框架都不知道是啥意思
    ly020044
    ly020044
    Dec 17, 2020
    25
    gopher 大军和 javaer 大军要开始了
    2379920898
    2379920898
    Dec 17, 2020
    26
    java 算个屁,我 GO 语言天下第一
    acmore
    acmore
    Dec 17, 2020
    27
    当一小撮人不搞无聊的价值观和立场对立的时候
    就是国内计算机真的崛起的时候
    sonxzjw
    sonxzjw
    Dec 17, 2020
    28
    人家说的是 [某某 go 代码] ,可能某某用 go 模拟写 java 吧。
    何必在意这些鸡毛蒜皮的事呢
    leeg810312
    leeg810312
    Dec 17, 2020 via Android
    29
    @hafuhafu 有时候就是写个项目中用的小工具,不套那些大中型项目的设计模式 1000 行代码差不多了,但是创建的人也整个全套 interface/impl/model/dao/repo/service,多了几倍的文件和代码
    sagaxu
    sagaxu
    Dec 17, 2020 via Android
    30
    @hafuhafu 如果绝大多数接口预期只有一个实现,那不是过渡设计是什么?
    dushixiang
    dushixiang
    Dec 17, 2020❤️2
    31
    上来先整一个 src 文件夹用于放 go 代码,可能是 Javaer 的风格。
    其实不需要的。
    Winchey
    Winchey
    Dec 17, 2020
    32
    等我有钱了,一定要买个能闻味道的电脑
    violence123456
    violence123456
    Dec 17, 2020 via iPhone
    33
    @littlecreek 说的太对了,我今年刚看了 java 和 springboot 就这种感觉。。。
    lewis89
    lewis89
    Dec 17, 2020
    34
    @FreeEx #31 额.. 资源文件混在一起 大项目几十个文件夹跟项目 还有各种配置 上万个文件 混在一起不是人都傻了。
    cco
    cco
    Dec 17, 2020
    35
    @FreeEx 这没啥吧。src 代表源码,pkg,bin 也不也有么。。
    lewis89
    lewis89
    Dec 17, 2020
    36
    什么时候连接口跟实现隔离的设计都成过度设计了? 各位软件工程是不是白学了..
    DomonLee
    DomonLee
    Dec 17, 2020
    37
    JAVA 味道到底是什么?
    zhady009
    zhady009
    Dec 17, 2020
    38
    @sagaxu 只用 jdk proxy 就要接口 没啥毛病
    lower
    lower
    Dec 17, 2020
    39
    记得有个开源项目,用 go 把 Spring 那一套实现了一遍……
    zarte
    zarte
    Dec 17, 2020
    40
    javer 写啥语言都爱整 java 那一套特烦人,之前在论坛发过帖子说 php 整 java 那套的,一堆人怼我说是正确做法,维护性高。
    sharpy
    sharpy
    Dec 17, 2020
    41
    @learningman 当初学 go 的时候,说的是云计算的 c
    lostpg
    lostpg
    Dec 17, 2020 via Android
    42
    @cco 不是一个东西,go 的 src 是 gopath 时代用来存放所有 golang 的源码库的文件夹,和 src 文件夹平级的 pkg 和 bin 分别存放依赖和编译生成。一个源码库里面理论上不出现 src 文件夹,直接以 package 的形式区分。
    guyeu
    guyeu
    Dec 17, 2020
    43
    主要写 java 也写过 go,真想学一下咋把 go 写出 java 味。。
    anonydmer
    anonydmer
    Dec 17, 2020
    44
    @lewis89 #36, 没写过测试代码都这样,没必要跟他们急
    itskingname
    itskingname
    Dec 17, 2020❤️3
    45
    写 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
    namelosw
    Dec 17, 2020 via iPad
    46
    Java 味不光在 Go 常见,在哪都常见,典型的就是到处糊设计模式。

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

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

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

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

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

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

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

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

    例如,java 的 model 包含项目中所有的模型。golang 一般是按用户模块,交易模块这么分。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1427 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 199ms · UTC 22:30 · PVG 06:30 · LAX 14:30 · JFK 17:30
    ♥ Do have faith in what you're doing.