初学 go 语言,经常看到有网友说某某 go 代码一股 Java 味 - V2EX
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 10591 次点击
    这是一个创建于 1761 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小白想问问:

    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 开发,初学 g,现在甚至连 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:4: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 怕是连编译都搞不定。
    akagishigeru
        79
    akagishigeru  
       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     Solana     5572 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 07:21 PVG 15:21 LAX 00:21 JFK 03:21
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86