Golang Go语言学习中的不解之处请教各位大佬

发布于 1周前 作者 itying888 来自 Go语言

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


Golang Go语言学习中的不解之处请教各位大佬
51 回复

go 没这么多包袱,用最新稳定版就好了。看看语法一天就直接上手写项目

更多关于Golang Go语言学习中的不解之处请教各位大佬的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


菜鸟教程 go 看一遍,直接上手写,遇到不会的问问 ChatGPT

要兼容 Win7 等老系统用 go1.20 或更低版本,在 Win10 及以上系统上不需要兼容老旧系统直接最新稳定版。

Golang 第二语言指南: 学习路径、最佳实践以及工程化
https://nanmu.me/zh-cn/posts/2021/way-to-go/

注意一下你的开发环境和运行环境的系统,如果都满足条件就用最新的

比如说提案上写着将来 go1.24 需要 Linux 3.17 kernel ,也就是不支持 centos7.x 。https://github.com/golang/go/issues/67001

别纠结版本,用最新的就行了,go 的新版本特性不多,兼容性也是保障的

云原生+go = Linux 容器中运行 没有兼容性包袱 用最新就行

按照我厂给的规范,生产使用的版本要落后官方一个大版本。也就是官方现在推出的事 1.23 ,我们就推荐使用 1.22.

go 的优势就是上手比较容易,有一点点难度的可能就是 interface 了。直接用最新版就可以,感觉没多大差别

生产项目都直接用最新版,而且还用上了 exp 的一些函数,项目组很多兼容性写法都被领导批没必要。项目编写时,go 也发展了几个版本,旧版写法也是非必要就不怎么动,新版写法也时不时会用一下。

最新的不就是 1.22.4 吗?

看官方版本,例如现在 1.23 的小版本号是.3 ,而 1.22 版本是 1.22.9 ,那优先使用 1.22 版本

抓紧入云原生的坑, 现在还有点点红利可图.
现在的招聘最后几条, 都是会云原生的优先!

go 没有那么多道道,就是简单直接,干就完了

我就是举个例子。目前我们内部推荐使用的事 1.21 ,永远落后官方一个版本。

不要相信学 go 一天上手这样的说法,如果你有其它语言的知识背景,倒是可以快速上手。

一天上手?是上手 hello world 么。。。

go 没有 java 那个习惯,新版本基本上兼容旧版本代码。一般建议用次新版本,另外,1.18 是首个泛型版本注意。

有别的语言基础,几天上手没有太大问题,使用 web 框架就可以开始写一些简单的业务了,但如要深入得花不少时间,我用 go 好几年了,日常工作大部分都是 CRUD 。
goroutine ,channel ,并发编程,网络编程,GMP 调度模型,GC 原理,逃逸分析,runtime 等,都是值的深入研究的。

不错, 我收藏了

话说,有没有人遇到过 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 )?

java 转 go 第一步先忘记 java

Go 的版本都是跟着公司走的,公司你说了算就可以最新版,虽然实现可能有变更,但是兼容老版本编译。你不会没有自动化测试的吧,对吧…


这种东西都是开白名单的,小众编程语言都有这个问题,只是其他的更新没那么快,Go 就显得比较特殊了,Go 现在变大众了,就没这些问题了

之前尝试过 go, 它的错误处理和日志没有堆栈真的反人类. 想问下实际项目中, 真的所有方法都返回一个 err 处理吗, 那这不和 java 中的 throws Exception 一样吗.

找到有人曾在官方的 GitHub 上反馈过这个问题 https://github.com/golang/go/issues/44323 ,现在来看应该就是 1.16 版本被误报了,最新的应该没问题


error 是用户态可以处理的错误(原则上也必须处理的),不能处理的用 panic ,panic 有堆栈信息
logger 的话用 zap ,也可以打堆栈

#24 是的, 所以大部分 go 项目中如下代码是最多的

if err != nil {
return nil,err
}

operator 不一定要用 go 写,别的语言也能写

对。linkerd 有一部分用 rust 写了。

这个只是不维护优化,编来跑一般还是没问题的

直接最新的完事。

是吗?官方文档写的是 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

其实并没有什么关系,事实上直到 go1.21.3 还是能在 win7 上正常运行的,只是 1.21.4 调用了一个新的 win32 api 后才导致无法启动的

对于 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 上正常运行,同时也不会增加编译出的文件大小

翻阅了一下相关 commit ,@Seves 提到的包减小了是因为
https://go-review.googlesource.com/c/go/+/475378
这个提交将 pkg/tool 中二进制文件的 debug info 信息删除所以才减小了那么多,和移除了对旧系统的支持无关

#33 哦哦,这样啊。很好奇那三十四兆是怎么减小的。

#35 原来如此,感谢。

#33 我在 Win7 上从 go1.21.3 往下试到 go1.20.14 ,go1.21 的版本都会报错:

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

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

你这个问题应该是系统内存不够导致的,高版本 golang 需要更大的虚拟内存空间,我这边只测试了在 win7 的 64bit 下是可以正常工作的

#39 所以为了同时兼容 32 和 64 位的老系统,最好还是不要用 go1.20 以上版本。

这么说也确实没问题,我这边的实测是 1.21.3 编译出来的 386/amd64 产物均可以在 win7 64bit 下正常运行,去除#34 提到的指定 commit 的 go1.21 和 go1.22 也都可以在 win7 64bit 下正常运行
至于 32 位系统下为何不行,但是在 64 位系统下 wow64 可以的问题我没有深入测试过,能找到的资料也非常有限,一直没人深究到底是哪个 commit 的改动引发了这个不兼容

我现在就有个 1.22 的跑在 Windows Server 2012 上

#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

#43 也报错,但报的是另一个 dll 没有找到:

你这个报错感觉是系统有很多补丁没打吧,能看一下你系统上 C:\Windows\System32\advapi32.dll 的详细信息么

#44 我再次重新安装了一次 win7 ,在没有安装 kb4474419 的时候出现了和你一样的报错,安装后即可正常启动了
https://www.catalog.update.microsoft.com/search.aspx?q=kb4474419
实际上很多非 golang 程序的安装也必须要建立在安装 kb4474419 之后(如 vmtools ),具体原因还需要探究

#46 我最后安装的补丁是 KB2534111 ,安装 KB4474419 后确实可以运行了。🤙🤙🤙

1.8 以上吧,泛型 挺好的,适合封装些小工具

找到原因了
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 的问题

版本别太老比如 1.9 这种,1.11 之后的区别不是很大

在Go语言学习过程中遇到不解之处是很正常的,这里我尝试解答一些常见的学习难点,希望能帮到你。

首先,理解Go语言的并发模型(goroutines和channels)是关键。Go语言天生支持并发,但并发并不意味着并行。Goroutines是非常轻量级的线程,它们允许你在同一个程序中运行多个函数。而channels则是Go语言中用于在不同goroutines之间进行通信的主要方式,它们使得并发编程变得更加安全和直观。

其次,接口(interface)在Go语言中扮演着非常重要的角色。与很多其他编程语言不同,Go语言的接口是隐式实现的,即只要一个类型实现了接口中的所有方法,它就自动实现了该接口。这种设计使得代码更加灵活和可扩展。

再者,对于错误处理,Go语言采用了多返回值的方式,这是与其他很多编程语言不同的地方。在处理函数错误时,你需要检查返回值的第二个参数(通常是error类型),以确定是否发生了错误。

最后,学习Go语言时,掌握标准库的使用也是非常重要的。Go语言的标准库非常强大,涵盖了网络编程、文件操作、加密解密、JSON处理等多个方面。

如果你在具体的学习过程中遇到了具体的问题或代码上的困惑,建议将问题具体化,这样我可以给出更精确的解答。希望这些建议对你有所帮助,祝你在Go语言的学习之路上越走越远!

回到顶部