Go 语言、变量和类型的历史
点击订阅我的新闻通讯
点击在 Twitter 上关注我
点击查看我的 Github
这是我即将每周发布的博客系列的开篇。我将撰写关于我学习 Go 编程语言的经验和发现的文章。我的学习媒介包括视频、书籍和讲座。本周,我将讨论我完成了Todd McLeod课程的约 25 个视频片段后所学到的知识。
为什么选择 Go?
除了我对编程和计算机科学的热情之外,坦白说,我对这个问题并没有一个令人信服的答案。以下是我最初感兴趣的一些想法:
- 由 Google 创建并在其内部广泛使用
- 我听说它非常有效
- 它在科技行业相当受欢迎
- 许多公司都在使用它
- 社区保持创新和参与
历史
Go,或者说Golang,是由 Rob Pike、Robert Griesemer 和 Ken Thompson 于 2009 年创建的。这些名字对你来说可能意义不大;然而,他们都为软件开发行业做出了巨大贡献。
Rob Pike - Unix 核心团队成员,创建了 UTF-8 编码方案
Robert Griesemer - 与编程语言 Pascal 的创始人 Niklaus Wirth 密切合作
Ken Thompson——设计并实现了最初的 Unix 系统,并帮助发明了 C 编程语言
它是编译的、并发的、垃圾收集的和静态类型的。
你为什么要关心?
好问题。我觉得 Todd McLeod 的回答很有见地:
- 高效编译
- 高效执行
- 易于编程
简洁明了,高效便捷?划算!
学习 Go 的第一周,我就已经能感受到它是多么的有趣了。我迫不及待地想深入学习更多。
您可以使用 Go 来做什么?
我发现 Go 可以用于很多不同的应用程序,其中包括:
- 命令行工具
- 密码学
- 图像处理
- HTTP / UDP / TCP
- 并发(很高兴了解更多有关此内容的信息!)
类型为王
Go 是一门静态类型语言——类型很重要,而到目前为止,我主要使用 JavaScript,一种动态类型语言。坦白说:我很少考虑类型;但是,我知道使用静态类型语言会让我成为一个更优秀的开发者。
惯用思维
在学习这门课程之前,我根本不知道“idiomatic”是什么意思。听到“Idiomatic Go”这个词,我顿时一阵恐慌——我是不是有点儿想不通了?这听起来太“聪明”了,我可没那么容易理解。“ Idiomatic ”这个词源于“Idiom”,而“Idiom”这个词远没有那么吓人:
成语
一组由习惯所确定的词,其含义不能从单个词中推断出来
本质上,“惯用围棋”是一种被创造者认可的、在围棋语言中约定俗成的书写风格和方法。
用更小的东西构建更大的东西
Go 应用程序由包组成。我习惯用文件及其各自的文件夹来理解应用程序。相比之下,Go 更加简洁、精简。
我接触的第一批 Go 程序之一是传统的“Hello World”程序。我知道有时人们很容易认为这些例子“过于琐碎”,但我发现它们很有用。先学会走路,再学会跑步,对吧?
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello world")
}
很简单吧?让我来解释一下是怎么回事。首先,每个 Go 应用程序都必须有一个main
包。这些包通常位于应用程序main.go
的 文件中ROOT
。许多包,包括fmt
,都来自Standard Library
Go 的 ,它们轻量且快速。
所有Go 应用程序的入口点都是main
函数。应用程序的所有代码都在这里运行。当此函数执行完代码后,程序就完成了。
从包的角度思考
Go 的设计理念是让您在创建应用程序时以包的形式进行思考。包其实就是一个包含部分功能的源文件。Unix 显然对 Go 的创建产生了巨大的影响,因此它们拥有共同的理念——用更小的东西构建更大的东西。
小巧、简洁、一口大小。
变量
Go 语言内置了一些非常酷炫的变量处理机制。我最喜欢的一点是:你不能声明一个变量而不使用它。这又回到了 Go 语言的原则和目标之一——性能。通过强制所有声明都使用,你可以帮助提高内存效率。
变量的另一个很酷的特性是可以“丢弃”返回值。可以像这样实现:
package main
import (
"fmt"
)
func main() {
id, _ := ReturnId()
}
在函数内部,main
我预期会收到两个返回值ReturnId
;然而,在本例中,我只关心 的值id
。通过使用 ,_
我“丢弃”了第二个返回值。
短声明运算符
到目前为止,我已经了解了在 Go 中声明变量的两种常用方法,尽管它们非常相似,但显着的区别是它们的范围。
短声明运算符
:=
<---- 短声明运算符(看起来像地鼠)
这种声明变量的方法似乎是编写 Go 程序时最常见的。我认为主要原因是它位于function scope
。将变量尽可能靠近要执行的操作,可以降低变量产生副作用或被修改的风险。
- 必须在函数体内声明
- 不能用类型声明
var 关键字
声明变量的另一种常见方法是使用var
关键字。关于关键字的不同之处,以下是一些说明var
:
- 可以在函数体外部声明
- 可以用类型声明(
int
、string
、map
等)
只是重申一下:最佳做法是尽可能使用简短声明运算符。
类型
我还没有深入研究 Go 中的类型,但我知道以下类型:
- 原始数据类型:布尔值、数字(浮点数、整数等)和字符串
- 复合数据类型:数组、结构体、指针、函数、接口、切片、映射和通道
零值
关于使用var
关键字,我学到了一件很酷的事情:当你声明一个没有初始值的变量时,Go 编译器会自动分配一个叫做 的值zero value
。以下是常见数据类型的零值:
var y string
// ""
var z int
// 0
var z bool
// false
// nil for pointers, functions, interfaces,
// slices, channels, maps
创建自己的类型
除了使用 Typescript 中的接口之外,我几乎没有创建自己的类型的经验。我发现 Go 让这变得非常容易。
package main
import (
"fmt"
)
var a int = 42
type midichlorian int
var b midichlorian
func main() {
fmt.Print.ln(a)
// 42
fmt.Printf("%T\n", a)
// int
b = 43
fmt.Print.ln(b)
// 43
fmt.Printf("%T\n", b)
// main.midichlorian
}
如上所示,我声明了一个a
类型名为 的变量int
。接下来,我使用type
关键字 定义了一个int
名为 的新类型midichlorian
。这里需要注意的是,虽然我声明了一个名为 的新类型midichlorian
,但它的底层类型是int
。
“转换”而不是“投射”
由于 Go 强大的静态类型特性,转换值的操作必须完全经过深思熟虑,这才说得通。在 JavaScript 中,这被称为类型转换,并不完全可靠。Go 采用了不同的方法——转换值的类型,而不是强制类型转换。我将在下面进行演示。
package main
import (
"fmt"
)
var a int = 42
type midichlorian int
var b midichlorian
func main() {
a = 42
fmt.Println(a)
// 42
fmt.Printf("%T\n", a)
// int
b = 43
fmt.Println(b)
// 43
fmt.Printf("%T\n", b)
// main.midichlorian
// CONVERSION <<<<<<
a = int(b)
fmt.Println(a)
// 43
fmt.Printf("%T\n", a)
// int
}
如你所见,我们声明了一个类型为的变量,b
其值为。然后,我们将转换函数的返回值重新赋值给该变量。是不是很酷?Go 语言中,你所使用的类型完全没有不确定性。43
midichlorian
a
int()
b
总之
第一周的学习过得有点迷茫——要学的东西太多了,而我已经学过的东西也太多了。我非常期待继续深入学习 Go。得益于 Go 的静态类型特性以及其强大的标准库包,我感觉自己已经学会了如何编写更简洁、更安全、更高效的代码。最棒的是,我知道这仅仅是个开始。我非常期待继续与大家分享我学到的知识。
文章来源:https://dev.to/lexingdailylife/learning-go-week-1-192c