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

12 天前
 Just4L

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

4595 次点击
所在节点    Go 编程语言
50 条回复
XIU2
12 天前
话说,有没有人遇到过 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
12 天前
java 转 go 第一步先忘记 java
crackidz
12 天前
Go 的版本都是跟着公司走的,公司你说了算就可以最新版,虽然实现可能有变更,但是兼容老版本编译。你不会没有自动化测试的吧,对吧...


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

if err != nil {
return nil,err
}
PN27149
12 天前
operator 不一定要用 go 写,别的语言也能写
zidy
12 天前
@PN27149 对。linkerd 有一部分用 rust 写了。
lysShub
12 天前
@Seves 这个只是不维护优化,编来跑一般还是没问题的
Ipsum
12 天前
直接最新的完事。
Seves
11 天前
@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
11 天前
@Seves 其实并没有什么关系,事实上直到 go1.21.3 还是能在 win7 上正常运行的,只是 1.21.4 调用了一个新的 win32 api 后才导致无法启动的
wwqgtxx
11 天前
对于 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
11 天前
翻阅了一下相关 commit ,@Seves 提到的包减小了是因为
https://go-review.googlesource.com/c/go/+/475378
这个提交将 pkg/tool 中二进制文件的 debug info 信息删除所以才减小了那么多,和移除了对旧系统的支持无关
Seves
11 天前
@wwqgtxx #33 哦哦,这样啊。很好奇那三十四兆是怎么减小的。
Seves
11 天前
@wwqgtxx #35 原来如此,感谢。
Seves
11 天前
@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
11 天前
@Seves 你这个问题应该是系统内存不够导致的,高版本 golang 需要更大的虚拟内存空间,我这边只测试了在 win7 的 64bit 下是可以正常工作的
Seves
11 天前
@wwqgtxx #39 所以为了同时兼容 32 和 64 位的老系统,最好还是不要用 go1.20 以上版本。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1050717

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX