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

关于学习 go 语言不解之处请教各位大佬

  •  
  •   Just4L · 168 天前 · 5357 次点击
    这是一个创建于 168 天前的主题,其中的信息可能已经有所发展或是发生改变。

    鉴于当前形势,加之对云原生技术的爱好,所以想从用一些云原生组件到开发一些 operator ,这就要用到 go 语言了。 所以想请教一下大佬们,现在开发 go 语言,都用什么版本比较好啊,就像 java 的话 java8 用的人比较多一样,go 有这个说法么? 另外有啥好的学习资料可以推荐么? 抱拳.jpg

    第 1 条附言  ·  168 天前
    哇,大佬好多啊!
    感谢各位大佬,大佬们这么一说,小弟心里顿时有底了,前路的迷雾也瞬间散去,搞起来!
    再次抱拳感谢.jpg
    第 2 条附言  ·  167 天前
    再次感谢各位大佬,小弟现在干劲十足^_^
    奋斗.jpg
    50 条回复    2024-06-27 10:14:23 +08:00
    thoo61871
        1
    thoo61871  
       168 天前   ❤️ 1
    go 没这么多包袱,用最新稳定版就好了。看看语法一天就直接上手写项目
    Smilencer
        2
    Smilencer  
       168 天前 via iPhone   ❤️ 1
    菜鸟教程 go 看一遍,直接上手写,遇到不会的问问 ChatGPT
    UxwVI042kEc5pNx6
        3
    UxwVI042kEc5pNx6  
       168 天前   ❤️ 3
    要兼容 Win7 等老系统用 go1.20 或更低版本,在 Win10 及以上系统上不需要兼容老旧系统直接最新稳定版。
    nanmu42
        4
    nanmu42  
       168 天前 via iPhone   ❤️ 6
    Golang 第二语言指南: 学习路径、最佳实践以及工程化
    https://nanmu.me/zh-cn/posts/2021/way-to-go/
    Cannian
        5
    Cannian  
       168 天前   ❤️ 2
    注意一下你的开发环境和运行环境的系统,如果都满足条件就用最新的

    比如说提案上写着将来 go1.24 需要 Linux 3.17 kernel ,也就是不支持 centos7.x 。https://github.com/golang/go/issues/67001
    redbule
        6
    redbule  
       168 天前   ❤️ 1
    别纠结版本,用最新的就行了,go 的新版本特性不多,兼容性也是保障的
    AEnjoyable
        7
    AEnjoyable  
       168 天前 via Android   ❤️ 1
    云原生+go = Linux 容器中运行 没有兼容性包袱 用最新就行
    lifei6671
        8
    lifei6671  
       168 天前   ❤️ 2
    按照我厂给的规范,生产使用的版本要落后官方一个大版本。也就是官方现在推出的事 1.23 ,我们就推荐使用 1.22.
    dhb233
        9
    dhb233  
       168 天前   ❤️ 1
    go 的优势就是上手比较容易,有一点点难度的可能就是 interface 了。直接用最新版就可以,感觉没多大差别
    koplonjaslon02
        10
    koplonjaslon02  
       168 天前
    生产项目都直接用最新版,而且还用上了 exp 的一些函数,项目组很多兼容性写法都被领导批没必要。项目编写时,go 也发展了几个版本,旧版写法也是非必要就不怎么动,新版写法也时不时会用一下。
    ripperdev
        11
    ripperdev  
       168 天前
    @lifei6671 最新的不就是 1.22.4 吗?
    guanzhangzhang
        12
    guanzhangzhang  
       168 天前
    看官方版本,例如现在 1.23 的小版本号是.3 ,而 1.22 版本是 1.22.9 ,那优先使用 1.22 版本
    BinaryDH
        13
    BinaryDH  
       168 天前
    抓紧入云原生的坑, 现在还有点点红利可图.
    现在的招聘最后几条, 都是会云原生的优先!
    whyso
        14
    whyso  
       168 天前
    go 没有那么多道道,就是简单直接,干就完了
    lifei6671
        15
    lifei6671  
       168 天前
    @ripperdev 我就是举个例子。目前我们内部推荐使用的事 1.21 ,永远落后官方一个版本。
    afxcn
        16
    afxcn  
       168 天前
    不要相信学 go 一天上手这样的说法,如果你有其它语言的知识背景,倒是可以快速上手。
    Richared
        17
    Richared  
       168 天前
    一天上手?是上手 hello world 么。。。
    lasuar
        18
    lasuar  
       168 天前
    go 没有 java 那个习惯,新版本基本上兼容旧版本代码。一般建议用次新版本,另外,1.18 是首个泛型版本注意。
    slion
        19
    slion  
       168 天前   ❤️ 1
    有别的语言基础,几天上手没有太大问题,使用 web 框架就可以开始写一些简单的业务了,但如要深入得花不少时间,我用 go 好几年了,日常工作大部分都是 CRUD 。
    goroutine ,channel ,并发编程,网络编程,GMP 调度模型,GC 原理,逃逸分析,runtime 等,都是值的深入研究的。
    shinession
        20
    shinession  
       168 天前   ❤️ 1
    @nanmu42 不错, 我收藏了
    XIU2
        21
    XIU2  
       168 天前
    话说,有没有人遇到过 Go 编译出来的文件被误报毒的问题?

    几年前的时候,我就遇到过,我升级最新的 Go 1.16 版本并编译发布新版本后,就开始有人反馈出现各杀毒软件报毒的情况,临时装个旧 Go 版本编译就正常,新版本 1.16 的 Go 哪怕只写个 Hello, World! 都报毒(而且经过观察似乎只针对 Windows 64 位 的编译版本),给我整不会了,最后我只能去各杀毒软件提交申诉,不过只有个别杀毒软件回复解决了,有些就石沉大海或者干脆找不到申诉入口。

    不过后来似乎就没人反馈误报毒了,似乎是各杀毒软件对 Go 新版本特殊处理了?
    我后来也在官网看到官方提到了误报的事情,似乎是很普遍的情况?

    Why does my virus-scanning software think my Go distribution or compiled binary is infected?
    This is a common occurrence, especially on Windows machines, and is almost always a false positive. Commercial virus scanning programs are often confused by the structure of Go binaries, which they don't see as often as those compiled from other languages.

    If you've just installed the Go distribution and the system reports it is infected, that's certainly a mistake. To be really thorough, you can verify the download by comparing the checksum with those on the downloads page.

    In any case, if you believe the report is in error, please report a bug to the supplier of your virus scanner. Maybe in time virus scanners can learn to understand Go programs.

    因为这个原因,导致我对更新 Go 版本非常谨慎,担心再次出现该问题,目前我还停留在 1.18 版本。。。

    所以我想知道,现在的 Go 新版本还存在这类问题么?
    是不是应该像楼上所说,最多只更新到次于最新版本( 1.22.0 )的版本号( 1.21.0 )?
    Pierro
        22
    Pierro  
       168 天前
    java 转 go 第一步先忘记 java
    crackidz
        23
    crackidz  
       168 天前
    Go 的版本都是跟着公司走的,公司你说了算就可以最新版,虽然实现可能有变更,但是兼容老版本编译。你不会没有自动化测试的吧,对吧...


    @XIU2 这种东西都是开白名单的,小众编程语言都有这个问题,只是其他的更新没那么快,Go 就显得比较特殊了,Go 现在变大众了,就没这些问题了
    yyancy517
        24
    yyancy517  
       168 天前
    之前尝试过 go, 它的错误处理和日志没有堆栈真的反人类. 想问下实际项目中, 真的所有方法都返回一个 err 处理吗, 那这不和 java 中的 throws Exception 一样吗.
    charslee013
        25
    charslee013  
       168 天前
    @XIU2 找到有人曾在官方的 GitHub 上反馈过这个问题 https://github.com/golang/go/issues/44323 ,现在来看应该就是 1.16 版本被误报了,最新的应该没问题
    pkoukk
        26
    pkoukk  
       168 天前
    @yyancy517
    error 是用户态可以处理的错误(原则上也必须处理的),不能处理的用 panic ,panic 有堆栈信息
    logger 的话用 zap ,也可以打堆栈
    ExplodingFKL
        27
    ExplodingFKL  
       168 天前
    @yyancy517 #24 是的, 所以大部分 go 项目中如下代码是最多的

    if err != nil {
    return nil,err
    }
    PN27149
        28
    PN27149  
       168 天前
    operator 不一定要用 go 写,别的语言也能写
    zidy
        29
    zidy  
       168 天前
    @PN27149 对。linkerd 有一部分用 rust 写了。
    lysShub
        30
    lysShub  
       168 天前
    @Seves 这个只是不维护优化,编来跑一般还是没问题的
    Ipsum
        31
    Ipsum  
       167 天前
    直接最新的完事。
    UxwVI042kEc5pNx6
        32
    UxwVI042kEc5pNx6  
       167 天前
    @lysShub 是吗?官方文档写的是 Go 1.21 开始至少需要 Windows 10 或 Server 2016 ,而不是停止维护。而且在 https://go.dev/dl/ 可以看到 Go 1.21 开始的包大小( 70MB 左右)比 Go 1.20 ( 100MB 左右)小了三四十兆,不是移除了对旧系统的支持应该小不了这么多。

    https://go.dev/doc/go1.20#windows

    wwqgtxx
        33
    wwqgtxx  
       167 天前
    @Seves 其实并没有什么关系,事实上直到 go1.21.3 还是能在 win7 上正常运行的,只是 1.21.4 调用了一个新的 win32 api 后才导致无法启动的
    wwqgtxx
        34
    wwqgtxx  
       167 天前
    对于 go1.21 来说,影响 win7 兼容性的 commit 只有一个
    https://github.com/golang/go/commit/9e43850a3298a9b8b1162ba0033d4c53f8637571
    对于 go1.22 来说,也就只有三个
    https://github.com/golang/go/commit/693def151adff1af707d82d28f55dba81ceb08e1
    https://github.com/golang/go/commit/7c1157f9544922e96945196b47b95664b1e39108
    https://github.com/golang/go/commit/48042aa09c2f878c4faa576948b07fe625c4707a
    然而这些 commit 都不可能导致包大小有 30m 的变动,当你手动 revert 这些 commit 后可以在 win7 上正常运行,同时也不会增加编译出的文件大小
    wwqgtxx
        35
    wwqgtxx  
       167 天前   ❤️ 1
    翻阅了一下相关 commit ,@Seves 提到的包减小了是因为
    https://go-review.googlesource.com/c/go/+/475378
    这个提交将 pkg/tool 中二进制文件的 debug info 信息删除所以才减小了那么多,和移除了对旧系统的支持无关
    UxwVI042kEc5pNx6
        36
    UxwVI042kEc5pNx6  
       167 天前
    @wwqgtxx #33 哦哦,这样啊。很好奇那三十四兆是怎么减小的。
    UxwVI042kEc5pNx6
        37
    UxwVI042kEc5pNx6  
       167 天前
    @wwqgtxx #35 原来如此,感谢。
    UxwVI042kEc5pNx6
        38
    UxwVI042kEc5pNx6  
       167 天前
    @wwqgtxx #33 我在 Win7 上从 go1.21.3 往下试到 go1.20.14 ,go1.21 的版本都会报错:

    fatal error: kernel32.dll not found
    runtime: panic before malloc heap initialized

    只有用 go1.20 编译的程序可以正常运行,所以还是有关系的。

    wwqgtxx
        39
    wwqgtxx  
       167 天前
    @Seves 你这个问题应该是系统内存不够导致的,高版本 golang 需要更大的虚拟内存空间,我这边只测试了在 win7 的 64bit 下是可以正常工作的
    UxwVI042kEc5pNx6
        40
    UxwVI042kEc5pNx6  
       167 天前
    @wwqgtxx #39 所以为了同时兼容 32 和 64 位的老系统,最好还是不要用 go1.20 以上版本。
    wwqgtxx
        41
    wwqgtxx  
       167 天前   ❤️ 1
    @Seves 这么说也确实没问题,我这边的实测是 1.21.3 编译出来的 386/amd64 产物均可以在 win7 64bit 下正常运行,去除#34 提到的指定 commit 的 go1.21 和 go1.22 也都可以在 win7 64bit 下正常运行
    至于 32 位系统下为何不行,但是在 64 位系统下 wow64 可以的问题我没有深入测试过,能找到的资料也非常有限,一直没人深究到底是哪个 commit 的改动引发了这个不兼容
    lysShub
        42
    lysShub  
       167 天前
    @Seves 我现在就有个 1.22 的跑在 Windows Server 2012 上
    wwqgtxx
        43
    wwqgtxx  
       165 天前
    @Seves #38 我手动装了一下 win7 32 位版本的系统,和你的版本一样也是 7601 ,但是我安装了 kb4474419 ,之后运行 golang1.21 版本编译出来的文件一切正常,你也可以测试一下我 patch 后的 1.22 编译出来的二进制兼容性如何
    https://github.com/MetaCubeX/mihomo/releases/download/v1.18.5/mihomo-windows-386-v1.18.5.zip
    UxwVI042kEc5pNx6
        44
    UxwVI042kEc5pNx6  
       165 天前
    @wwqgtxx #43 也报错,但报的是另一个 dll 没有找到:

    wwqgtxx
        45
    wwqgtxx  
       165 天前
    @Seves 你这个报错感觉是系统有很多补丁没打吧,能看一下你系统上 C:\Windows\System32\advapi32.dll 的详细信息么
    wwqgtxx
        46
    wwqgtxx  
       165 天前
    @Seves #44 我再次重新安装了一次 win7 ,在没有安装 kb4474419 的时候出现了和你一样的报错,安装后即可正常启动了
    https://www.catalog.update.microsoft.com/search.aspx?q=kb4474419
    实际上很多非 golang 程序的安装也必须要建立在安装 kb4474419 之后(如 vmtools ),具体原因还需要探究
    UxwVI042kEc5pNx6
        47
    UxwVI042kEc5pNx6  
       165 天前
    @wwqgtxx #46 我最后安装的补丁是 KB2534111 ,安装 KB4474419 后确实可以运行了。🤙🤙🤙
    nextvay
        48
    nextvay  
       165 天前
    1.8 以上吧,泛型 挺好的,适合封装些小工具
    wwqgtxx
        49
    wwqgtxx  
       165 天前
    @Seves 找到原因了
    https://github.com/golang/go/commit/a17d959debdb04cd550016a3501dd09d50cd62e7
    根据 msdn 文档:
    Windows 7 、Windows Server 2008 R2 、Windows Vista 和 Windows Server 2008:LOAD_LIBRARY_SEARCH_标志在安装了 KB2533623 的系统上可用。 若要确定标志是否可用,请使用 GetProcAddress 获取 AddDllDirectory 、RemoveDllDirectory 或 SetDefaultDllDirectories 函数的地址。 如果 GetProcAddress 成功,LOAD_LIBRARY_SEARCH_ 标志可以与 LoadLibraryEx 一起使用。
    所以在缺乏补丁的 win7 上就会出现找不到系统 dll 的问题
    kevinpendragon
        50
    kevinpendragon  
       160 天前
    版本别太老比如 1.9 这种,1.11 之后的区别不是很大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3381 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 11:43 · PVG 19:43 · LAX 03:43 · JFK 06:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.