本文首发于 PRSDigg(顶呱呱)© 2021 阿坦
转载请注明出处
原创不易,请多转发点赞
通过阅读了解到,Go 语言起源于 2007 年,是由 Google 三位顶级程序员利用 20 % 的业余时间,汲取了传统的 C 系编程语言 C++, Java 和 C# 的精粹而生,被誉为“21 世纪的 C 语言”,并且完全开源。具有语法简洁、易于使用、快速编译、开发高效等特点。
从了解到上述信息,我已经被 Go 语言迷住了。小时候我对 C 语言有过一些了解,印象中,那时 C 语言是最能让学习使用者了解计算机程序如何工作的一门语言,没有之一。再加上上述的 Go 语言的这些特点,我决定不能错过这门语言。
我的 Go 语言学习之旅
其实,我已经开始阅读 Go 语言的入门教程有两三周了,最开始阅读的是 xue.cn 的 《Go 入门指南》. 后来,在 Mixin 张鹏大佬的「Mixin123.one 中文群」看大佬们聊编程学习,从一开始学什么语言好,聊到了具体看什么教材,已经开发了好几个厉害的产品的王卓大佬提到了<< Head First Go >>,叮!我一下想起了 Head First 这个系列的编程教程,我曾读过一些,想起了好像里面有不少插图,相对于当时读过的其他的编程书籍有趣又易懂。于是,就沿着这个话题,通过王卓大佬了解到了这书亚马逊有卖。到亚马逊一看,确实有卖,70+ RMB 到了手上。
之前读《Go 入门指南》 老是打瞌睡,自打开始读 << Head First Go >>,一下不瞌睡了,头脑也清晰了不少。在阅读中,回想起了 Head First 系列教程的风格,<< Head First Go >> 是延续的之前教程一贯的风格,有许多插图,插图上有文字标记,帮助读者理解;有短小的代码示例辅助我们理解一些非常细小的知识点。(让人很有收获感!);有拆散的代码块,搞成冰箱贴的插图,让学习者自己像拼积木一样去组织代码。
总之,学习体验很棒!
今天分享的小工具,也是源自于这本<< Head First Go >>. 好,那下面我们直接开始!
配置开发环境
具体过程可以参考 《Go 入门指南》 第 2 章 《安装与运行环境》.
如果觉得麻烦,也可以直接在浏览器打开 https://play.golang.org, 紧接着,就能在 The Go Playground 玩耍了
![play_go.png](https://prsdigg.oss-accelerate.aliyuncs.com/7mm09wdch7wx0almqpsm3lo048mw)玩法
- 在黄色区域输入代码;
- 点击 Playground 右上方的 Format 按钮,系统会自动按照统一的格式规范为你的代码调整格式;
- 点击 Playground 右上方的 Run 按钮,运行代码。
代码逻辑
- 做一个输入框,让用户可以按照提示在里面输入考分;
- 判断:100、60 ~ 99、0 ~ 59 分别返回 满分、通过、失败;
- 输出判断结果。
写代码
接下来,就开始写代码了!
写 Go 的代码,第一件、且必须要做的事,就是要指定包:
package main
以 package
关键词开头,大概意思就是说“我要指定包了”,然后空一格,写包名。这里可以看到,包名是 main
, 当然,也可以写你自己想要给定的包名。只是 main
和别的你自己指定的包名有个区别,代码在运行时,系统会自动检索名为 main
的包,然后执行它里面的内容;而其它的包则不会检索执行。
包名指定好之后,就要引入模块了,Go 有许多现成的模块,可以在你当前编辑的代码里引入各种各样的模块,使用那些模块里的方法、调用那些模块里的属性。
import (
"bufio"
"fmt"
"log"
"os"
"strings"
"strconv"
)
我们今天的这个小工具要用的的模块分别是 bufio
, fmt
, log
, os
, strings
, strconv
6 个模块。(先不用管他们是什么,下面用的时候慢慢琢磨渐渐就明白了)
接下来,开始定义 main 函数:
func main() {
fmt.Print("Enter a grade: ") // 提示用户输入考分
reader := bufio.NewReadString(os.Stdin)
// 调用 bufio 模块的 NewReadString 方法,新建一段缓存,用来保存用户输入的考分
input, err := reader.ReadString('\n')
// 当用户敲击回车键,就把之前缓存到的内容,赋值给 input 变量,因为还有一个关于错误信息的返回值,所以还需要一个变量来保存错误信息,这里这个变量是 err
if err != nil {
log.Fatal(err)
}
// 如果程序正常执行,没有发生错误,则这个关于错误的返回值会返回一个 nil, 上面 if 语句的意思是,如果返回值不是 nil, 代码就结束运行,输出错误信息。
input = strings.TrimSpace(input)
// 用户输入考分,敲击回车键之后,保存到 input 变量的值会带有 `\n`, strings.TrimSpace() 方法将换行符从输入中删除
grade, err := strconv.ParseFloat(input, 64)
// 调用 strconv 包中的 ParseFloat() 方法,把用户输入转换成 float64 值(64 位浮点数),然后赋值给变量 grade, 同时返回错误信息到变量 err.
if err != nil {
log.Fatal(err)
}
// 和上面的 if 语言作用相同
var status string // 定义一个名为 status 的变量,类型指定为字符串型(string)
if grade == 100 {
status = "perfect!"
} else if grade >= 60 {
status = "passing."
} else if grade < 60 {
status = "failing."
}
// 这里是 if...else 语句,用来按照不同区间的分数(grade)添加不同的 status, 当 grade 为 100, 把 "perfect!" 赋值给 status; 当 grade 在 60 以上(包括 60),把 "passing." 赋值给 status; 当 grade 在 60 以下,把 "failing." 赋值给 status.
fmt.Print("A grade of", grade, "is", status)
// 打印输出,翻译成中文是 “分数为 grade,状态是什么什么(通过、没通过、或者'破儿匪')”
}
跑代码
好了,代码的编写就介绍完了,到 https://play.golang.org 动手去试试吧!
![run_pass_fail.png](https://prsdigg.oss-accelerate.aliyuncs.com/e06f75wutdys9u8j07c2phow39pt)Shit! 在 The Go Playground 里 import 包好像不太行!老铁们还是自己配置 Go 开发环境吧!先在 The Go Playground 简单玩玩,其实我觉得也不错。
各位伙伴可以看看代码在我这里运行的情况:
![run_pass_fail_r.png](https://prsdigg.oss-accelerate.aliyuncs.com/u5qazbmtnecc8tr1cnjlzznqiywj)Tips
看到这里,可能有已经配置好 Go 开发环境的小伙伴,已经可以把代码跑起来了。但是对于具体代码,还是有许多不清楚的地方。在这里,我把 Go 语言区别于 JavaScript, Python 所独有的一些特点给各位做一下梳理,相信您看完之后,对今天的代码就整体上基本能够理解了。
关于模块
- 引入的模块( 其实我也是第一次接触,班门弄斧实在有点不好意思,但是不管了,知道多少说多少吧 🚴♂️):
-
bufio
: 看长相,你感觉它的发音,就可能跟缓存有关系,它有个 NewReadString() 方法, 看它里面的单词,大概意思就是新建一段读取的字符串,缓存它; -
os
: 在代码中是这样用的 os.Stdin 它是作为参数放在 bufio.NewReadString() 里面的,即 bufio.NewReadString(os.Stdin),那这个 os.Stdin 可能搞一个输入框给用户输入文本的意思; -
log
回到代码中,log.Fatal(err) 它是这样用的,log 一般跟日志有关系,应该就是处理错误信息的一个方法; -
strings
: 回到代码中,strings.TrimSpace(input), 这个模块应该是打包了一些处理文本的方法,在这里用 TrimeSpace 清除用户输入内容前后的空格; -
strconv
回到代码中,strconv.ParseFloat(input, 64) 把用户输入转换成浮点数,让我们来大胆把模块名拓展一下,string conversion 关于字符串转换的; -
fmt
: 这个是 Go 语言非常常用的模块,format(格式化) 的缩写,比较常见的方法是 fmt.Println("…") 用来打印输出。 - 对了,Go 语言规定,在使用引入的模块的方法时,方法名要首字母大写,所以是 fmt.Println(), 而不是
fmt.println(); 而在主体代码文件里的方法,方法名必须以小写字母开头去定义和使用。
变量的定义与赋值
- Go 语言定义变量的语法为:var + 变量名 + 变量类型,举例,
var status string
这就定义了一个名为 status 的字符串型变量,后面就可以去给它赋值、使用它。 - Go 可以在定义的同时把值也赋了,
var status string = "what?"
在 Go 里,标识字符串必须要用且只能用两引号,单引号里的代表是另一个东西 —— 符文(这个先不讲); - 再进一步,声明变量同时赋值时,可以省略变量类型,把
=
换成:=
,var status := "what?"
, 这样,变量类型就会自动根据:=
右边的值的类型来确定。
关于函数的返回值
- Go 模块中的方法可以返回多个值,其它许多编程语言的函数或方法只能返回一个值,这点需要注意区分。
- Go 模块中的方法常常会返回一个用来保存错误的值。要注意没发生错误的情况,这时,会返回一个 nil 值,而不是什么都不返回。
关于 if 语句
- Go 的 if 语句条件部分不带小括号,这和 Python 不太一样,条件后面是一个代码块,即
{}
部分,条件成立就执行块里的代码。看看这个例子if err != nil { log.Fatal(err) }
.
好了,以上这些就是今天想要和大家分享的内容,感谢阅读!