Go 语言、变量和类型的历史

2025-06-07

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")
}
Enter fullscreen mode Exit fullscreen mode

很简单吧?让我来解释一下是怎么回事。首先,每个 Go 应用程序都必须有一个main包。这些包通常位于应用程序main.go的 文件中ROOT。许多包,包括fmt,都来自Standard LibraryGo 的 ,它们轻量且快速。

所有Go 应用程序的入口点都是main函数。应用程序的所有代码都在这里运行。当此函数执行完代码后,程序就完成了。

从包的角度思考

Go 的设计理念是让您在创建应用程序时以的形式进行思考。包其实就是一个包含部分功能的源文件。Unix 显然对 Go 的创建产生了巨大的影响,因此它们拥有共同的理念——用更小的东西构建更大的东西

小巧、简洁、一口大小。

变量

Go 语言内置了一些非常酷炫的变量处理机制。我最喜欢的一点是:你不能声明一个变量而不使用它。这又回到了 Go 语言的原则和目标之一——性能。通过强制所有声明都使用,你可以帮助提高内存效率。

变量的另一个很酷的特性是可以“丢弃”返回值。可以像这样实现:

package main

import (
    "fmt"
)

func main() {
    id, _ := ReturnId()
}
Enter fullscreen mode Exit fullscreen mode

在函数内部,main我预期会收到两个返回值ReturnId;然而,在本例中,我只关心 的值id。通过使用 ,_我“丢弃”了第二个返回值。

短声明运算符

到目前为止,我已经了解了在 Go 中声明变量的两种常用方法,尽管它们非常相似,但显着的区别是它们的范围

短声明运算符

:=<---- 短声明运算符(看起来像地鼠)

这种声明变量的方法似乎是编写 Go 程序时最常见的。我认为主要原因是它位于function scope。将变量尽可能靠近要执行的操作,可以降低变量产生副作用或被修改的风险。

  • 必须在函数体内声明
  • 不能用类型声明

var 关键字

声明变量的另一种常见方法是使用var关键字。关于关键字的不同之处,以下是一些说明var

  • 可以在函数体外部声明
  • 可以用类型声明(intstringmap等)

只是重申一下:最佳做法是尽可能使用简短声明运算符。

类型

我还没有深入研究 Go 中的类型,但我知道以下类型:

  • 原始数据类型:布尔值、数字(浮点数、整数等)和字符串
  • 复合数据类型:数组、结构体、指针、函数、接口、切片、映射和通道

零值

关于使用var关键字,我学到了一件很酷的事情:当你声明一个没有初始值的变量时,Go 编译器会自动分配一个叫做 的值zero value。以下是常见数据类型的零值:

var y string
// ""
var z int
// 0
var z bool
// false

// nil for pointers, functions, interfaces,
// slices, channels, maps
Enter fullscreen mode Exit fullscreen mode

创建自己的类型

除了使用 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
}
Enter fullscreen mode Exit fullscreen mode

如上所示,我声明了一个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
}
Enter fullscreen mode Exit fullscreen mode

如你所见,我们声明了一个类型为的变量,b其值为。然后,我们将转换函数的返回值重新赋值给该变量。是不是很酷?Go 语言中,你所使用的类型完全没有不确定性。43midichlorianaint()b

总之

第一周的学习过得有点迷茫——要学的东西太多了,而我已经学过的东西也太多了。我非常期待继续深入学习 Go。得益于 Go 的静态类型特性以及其强大的标准库包,我感觉自己已经学会了如何编写更简洁、更安全、更高效的代码。最棒的是,我知道这仅仅是个开始。我非常期待继续与大家分享我学到的知识。

文章来源:https://dev.to/lexingdailylife/learning-go-week-1-192c
PREV
我在 SRE 面试中提出的问题
NEXT
我“喜欢”反模式