欢迎加入GolangRoadmap,一个年轻的GO开发者社区https://www.golangroadmap.com/,目前是邀请制注册,注册码:Gopher-1035-0722,已开放GO内推,GO面试,GO宝典,GO返利等栏目

我们先来看这样一个例子(这是一个小伙伴在群里问的问题),这是一个使用了gomod来管理包的简单例子,当前项目在gopath路径外,且GO111MOUDLE=ON。大家觉得程序能不能正常运行?
gomod测试GO语言开发者论坛https://www.golangroadmap.com,邀请码:Gopher-1035-0722
答案是不能!,但只看程序编写和包引用的路径是完全正确,那为什么无法运行呢?我们来看运行结果
运行结果,www.oinote.com
编译器报出了如下错误,提示main.go文件找不到包,但路径完全没问题,这是为什么呢。

main.go:3:8: cannot find package

一开始我也找不到问题所在,后来我完全按照他的写法重写了一遍,是可以正常运行的。两个看起来完全一样的文件为什么运行结果会不同呢。这里我联想到了之前做前端的时候遇到的编码问题,我对比了两个main.go文件的编码。
不出所料两个文件的编码不同,可以正常运行的是UTF-8编码,不能运行的是带有BOM的UTF-8编码
UTF-8和带有BOM的UTF-8,GO语言开发者论坛https://www.golangroadmap.com,邀请码:Gopher-1035-0722
这里又有两个问题:为什么他建立的GO文件是带有BOM的UTF-8编码?为什么带有BOM的UTF-8编码的GO文件没法正常运行?

  • 第一个问题
    因为小伙伴之前是做asp开发的,习惯了使用带BOM的UTF编码
  • 第二个问题
    经过几番查找,找到了问题所在,在GO1.0发布的时候,GO语言的源文件(.go)明确要求必须是UTF8编码,而且是无BOM的UTF8编码。
    注意,这个无BOM的UTF8编码的限制仅仅是针对Go语言的源文件(.go),这个限制并不是说不允许用户处理带BOM的UTF8的txt文件!
    BOM的原意是用来表示编码是大端还是小端的,主要用于UTF16和UTF32,对于 UTF8 来说,BOM 没有任何存在的意义(正是Go的2个作者发明了UTF8, 彻底解决了全球的编码问题)。
    我们可以通过运行 go fmt 之后, 来删除掉文件里的BOM的(因为BOM就是然并卵)。也就是说带 BOM的Go源文件是不符合Go语言的编码风格的,go fmt 会强制删除BOM头.
    带BOM的UTF8除了然并卵之外还有很多问题, 因为BOM在string的开头嵌入了垃圾,导致正则表达式,string的链接运算等操作都被会被BOM这个垃圾所污染。对于 .go 语言,即使代码完全一样,有BOM和无BOM会导致文件的MD5之类的校验码不同。

最后小伙伴成功通过使用go fmt删除BOM头的方法运行成功了之前的项目文件。
在这里插入图片描述
在这里插入图片描述