本月Go语言将迎来10岁生日,所以我们特地罗列了10个让你快乐使用Go语言的理由。地图集/地图默认使用0值。在Go中使用maps时,即使你没有为那个键插入任何值,你也可以查询一个特定的键,并且它对应的值0不是nil,除非存储了一个指针。所以如果你有一个像m:=map[string]int这样的映射,你想得到m["hello"],返回的结果将是0,即使那个位置没有值。这允许我们编写代码而不必检查密钥是否存在,从而使代码更简洁。想象一下,如果我们想保存一个字符在字符串中出现的频率,我们只需要这样做:funccount(inputstring)(map[string]int){m:=map[string]int{}for_,s:=rangeinput{m[string(s)]++//这一步永远是安全的}returnm}在上面的代码中,我们在自增之前不需要判断key是否已经有值。不可变值默认情况下,将值传递给方法或函数时,您无法更改它。当您确实需要更改该值时,您需要传递一个指向该值的指针。它不像Rust那样严格,它需要在初始化时将变量标记为可变。不过,这意味着如果您调用一个不带指针的函数,您可以确定它不会弄乱您的结构。值不会默认为nil我不太喜欢任何语言的Null,所以我很高兴在Go中,你的结构或原始类型默认永远不会指向Nil,这消除了错误检查--的当然有一个例外,就是在使用指针的情况下,所以在这种情况下我们应该有错误处理机制。甚至Null的发明者TonyHoare也曾将其描述为“百万美元的错误”。typemyStructstruct{}funcmagic(mmyStruct){//没有指针,这种情况下不会出现Nil}funcmagicp(m*myStruct){//可能会出现空指针!}Nilslice==emptyslice是的,这又和Nil有关,因为我真的不喜欢Nil值。所以我爱上Go的另一个原因是,如果你有一个nilslice,它和一个空slice没有什么区别,所以你不需要分开一个slice是否为nil和它是否为空。恰好这也是我喜欢CommonLisp的原因之一,我很惊讶Go语言也能有这个特性。funcmain(){vars[]intiflen(s)==0{fmt.Println("hello")}}轻松发布相关库我似乎从来没有意识到这一点,直到我了解到用Go语言发布库是多么容易事物。我自己写了一些Go库,我唯一需要做的就是将它们推送到GitHub,然后其他人可以直接在项目中引用这个项目gogetgithub.com/4byte/{lib}。现在您还可以将它们添加为go模块,但这就像在GitHub上发布库一样简单。Go有很强的语法偏见,强制代码格式化。有些人喜欢它,有些人讨厌它,但Go确实是一种具有强烈句法偏差的语言。我个人喜欢它的风格,因为它去掉了很多代码审查中无用的部分。借用RobPike的话:Gofmt不会是某个人的最爱,但却是每个人的最爱。多范式编程你看到的很多Go代码都是面向对象的,但不一定非要面向对象。事实上,Go实际上可以成为一种很好的函数式编程语言,尽管它在某些地方缺少一些语法和特性。比如Go语言可以满足柯里化(FunctionCurrying)或者continuationpassingCPS风格的编程。虽然您不必让整个代码库都采用函数式编程风格,但您项目的某些部分可以使用它。在Go社区中,无论是IRC上的freenode/go-nuts还是gophers.slack.com,你都可以找到许多真正关心这门语言的开发者。而且这些社区对刚转入Go的新人非常友好。更好的是,Go社区在多样性和包容性方面做出了巨大努力,例如Git上的GoBridge项目和“WomenWhoGo”项目。无处不在Go基本上无处不在,你可以在任何平台上构建它,只要你提供正确的GOOS、GOARCH、CGO_ENABLED或GOARM标志等。这使得Go也可以运行在多种架构上,例如amd64、386和arm等。除此之外,Go还是第一个内置WebAssembly的语言。除了这些支持的平台,还有像TinyGo这样的项目在推动Go更强大的跨平台性和可移植性。Go被有意设计为一种简单的语言。Go从一开始就以简单为目标,如果它一直保持简单,它将非常成功。Go的语言规范是你可以从头到尾读完的东西(花不了多少时间),这意味着你可以在其他语言中找到的一些特性在Go中并不存在。其中一个比较有争议的是Go中缺乏泛型。我个人非常喜欢Go语言的简单性,它的一个好处是开发人员可以快速掌握这门语言,而且在你的同事使用你的东西的团队中几乎不会出现这种情况从未见过。程序结构的可能性。
