90DaysOfDevOps/2022/zh_cn/Days/day11.md

177 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: '#90DaysOfDevOps - 变量、常量和数据类型 - 第十一天'
published: false
description: 90DaysOfDevOps - 变量、常量和数据类型
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1048862
---
在我们开始今天的学习之前,我想向[Techworld with Nana](https://www.youtube.com/watch?v=yyUHQIec83I)和这段精彩简洁的Go基础之旅欢呼。
在[第8天](day08.md)我们设置了环境,[第9天]我们学习了Hello #90DaysOfDevOps 的代码,[第10天]我们查看了Go工作区并更深入了解了编译和运行代码。
今天我们要学习变量(Variables),常量(Constants)和数据类型(Data Types),并编写一个新的程序。
## Go中的变量和常量
让我们从规划这个应用程序开始,我觉得开发一个程序是告诉我们#90DaysOfDevOps挑战还有多少天的一个好办法。
这里首先要考虑的是,在构建应用程序时,我们欢迎参与者加入,并且我们会向用户反馈当前完成天数。我们将多次用到#90DaysOfDevOps。这是一个很好的例子将#90DaysOfDevOps作为我们程序中的一个变量。
- 变量用于存储值
- 类似一个带有信息或数值的盒子
- 后续我们可以在整个程序中使用这个变量,这将在变量发生改变时提供便利,我们只需要在一处改变它的值。这意味着我们可以只改变一个变量值,将其用于社区中的其他挑战中。
为了在我们的Go程序中声明变量我们使用一个**关键字**(keyword)来定义一个值。它将存在于我们稍后出现的`func main`代码块中。你可以在[keywords](https://go.dev/ref/spec#Keywords)中查看更多相关信息。
请记住并确保你的变量名是被定义的。如果你声明一个变量,你必须使用它,否则你会得到一个错误。这是为了避免可能出现的无效代码(那些从未被使用的代码)。对于未使用的包也是如此。
```
var challenge = "#90DaysOfDevOps"
```
通过上面的设置,我们会在后续代码片段中使用它,你可以通过下面的输出看到我们已使用这一变量。
```
package main
import "fmt"
func main() {
var challenge = "#90DaysOfDevOps"
fmt.Println("Welcome to", challenge "")
}
```
你可以在[这里](../../Days/Go/day11_example1.go)找到上述代码片段。
你会看到我们构建了上述示例代码,并得到下列输出。
![](../../Days/Images/Day11_Go1.png)
我们知道我们的挑战期限是90天但接下来也可能是100天所以我们想去定义一个变量来帮助我们记录。但是在我们的程序中我们想要把它定义为一个常量。常量和变量类似除了它们的值不能被改变(我们会创建一个新的应用并改变这个常量其中90的数值不会改变)。
添加`const`到我们的代码中,并添加一行来打印它。
```
package main
import "fmt"
func main() {
var challenge = "#90DaysOfDevOps"
const daystotal = 90
fmt.Println("Welcome to", challenge)
fmt.Println("This is a", daystotal, "challenge")
}
```
你可以在[这里](../../Days/Go/day11_example2.go)找到上述代码。
如果我们后续再次使用并运行`go build`,你会看到下列输出。
![](../../Days/Images/Day11_Go2.png)
最后,我们将在[第十二天](day12.md)的时候添加其他的功能。现在,我们想加入另外的变量来表示我们已完成这个挑战的天数。
我在下边添加了叫`dayscomplete`的变量,代表完成天数。
```
package main
import "fmt"
func main() {
var challenge = "#90DaysOfDevOps"
const daystotal = 90
var dayscomplete = 11
fmt.Println("Welcome to", challenge, "")
fmt.Println("This is a", daystotal, "challenge and you have completed", dayscomplete, "days")
fmt.Println("Great work")
}
```
你可以在[这里](../../Days/Go/day11_example3.go)找到上述代码。
再次运行`go build`或者直接使用`go run`。
![](../../Days/Images/Day11_Go3.png)
下面是更容易解读的代码示例。到目前为止,我们用到了`Println`,我们也可以将`Printf`配合`%v`(代表在代码后边的变量)来使用。另外使用`\n`来换行。
[这里](../../Days/Go/day11_example4.go)我用到了`%v`来使用默认格式,同时在[fmt package documentation](https://pkg.go.dev/fmt)中也谈到了其他的一些用法。
变量也可以用更简单的方式来定义。除了在定义的时候使用`var`和你可以使用的`type`,下面的代码也可以达到相同的目的,并且能做到更加简洁。这种方法只适用于变量,而不适用于常量(const)。
```
func main() {
challenge := "#90DaysOfDevOps"
const daystotal = 90
```
## 数据类型
在上述例子中我们并没有定义变量的类型这是因为Go会根据我们输入的值来得知它是什么类型至少它对保存的值有效。然而如果我们想让用户输入特定的数据类型情况又会有所不同。
我们已经在代码中用到了字符串和整型。整型用来表示天数,字符串用来表示这个挑战的名称。
这里需要关注的,不同的数据类型可以做不一样的事情。例如,整型可以做乘积,而字符串不可以。
下面列举了四种类型
- **基础型(Basic type)**,数字(numbers)、字符串(strings)、布尔型(booleans)在这个类别下。
- **聚合型(Aggregate type)**,数组(array)和结构体(structs)在这个类别下。
- **引用型(Reference type)**,指针(pointer)、切片(slices)、集合(maps)、函数(functions)和通道(channels)在这个类别下。
- **接口型(Interface type)**
数据类型是编程中的一个重要概念。数据类型明确了不同变量的大小和类型。
Go是静态的这意味着一旦变量的类型被定义了它只能用于储存该类型的数据。
Go有三种基本的数据类型
- **bool**: 指一个布尔值true或false
- **Numeric**: 指整型、浮点型和复杂型
- **string**: 指一个字符值
[Golang by example](https://golangbyexample.com/all-data-types-in-golang-with-examples/)给出了很详细的数据类型的例子。
我也推荐[Techworld with Nana](https://www.youtube.com/watch?v=yyUHQIec83I&t=2023s)里边有谈到许多Go中数据类型的详细内容。
如果我们想去定义一个变量的类型,我们可以做以下操作:
```
var TwitterHandle string
var DaysCompleted uint
```
因为Go给定了变量一个值我们可以直接打印出来
```
fmt.Printf("challenge is %T, daystotal is %T, dayscomplete is %T\n", conference, daystotal, dayscomplete)
```
对于整型和浮点型还有许多不同的种类,你可以查看上面提到的链接,阅读更详细的内容。
- **int** = 整数
- **unint** = 正整数
- **floating point types** = 含有十进制分量的数
## 相关资料
- [StackOverflow 2021 Developer Survey](https://insights.stackoverflow.com/survey/2021)
- [Why we are choosing Golang to learn](https://www.youtube.com/watch?v=7pLqIIAqZD4&t=9s)
- [Jake Wright - Learn Go in 12 minutes](https://www.youtube.com/watch?v=C8LgvuEBraI&t=312s)
- [Techworld with Nana - Golang full course - 3 hours 24 mins](https://www.youtube.com/watch?v=yyUHQIec83I)
- [**NOT FREE** Nigel Poulton Pluralsight - Go Fundamentals - 3 hours 26 mins](https://www.pluralsight.com/courses/go-fundamentals)
- [FreeCodeCamp - Learn Go Programming - Golang Tutorial for Beginners](https://www.youtube.com/watch?v=YS4e4q9oBaU&t=1025s)
- [Hitesh Choudhary - Complete playlist](https://www.youtube.com/playlist?list=PLRAV69dS1uWSR89FRQGZ6q9BR2b44Tr9N)
接下来我们会开始添加一些用户输入的功能到程序中,我们可以查询已经完成了多少天的挑战。
[第十二天](day12.md)见。