这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天。
今天,我主要学习了Go语言的基础入门部分。
一、Go的安装与部署
Go类似于传统的C/C++,它是一种编译型语言,而不是类似Java的半编译语言或者类似python的解释性语言。
我们可以前往Go官网进行下载,随后安装时一路点击“下一步”即可。
如果发现国内访问Github镜像速度过慢,我们可以选择用某个镜像站来代替,通过设立代理的方式来加快速度。
对于开发环境,我们可以选择使用JetBrains系列的Goland IDE,也可以选择使用万能的VSCode+插件的方式来进行开发,我选择了后者(主要是因为莫得钱买正版,而且Goland不像IDEA那样可以使用学生版)。
二、Go的基础语法
Go语言秉承了“简洁”的特征,尽可能少的引入语言特性,以清晰明了为第一标准。与此同时,Go IDE还会对代码文件进行强制格式化,这虽然使得码风变得朴素单调,但这也在最大程度上保证了整体代码的可读性,也就是说虽然不至于太漂亮,但是也不会太烂。你无法想C/C++那样天马行空,也不能像python一样在数行内写出 pythonic 的代码,但是它能够最为高效的保证团队开发与沟通的效率。
2.1 基础语句
这里我们主要介绍一下变量定义和一些简单语句:
var s = "hello"
var x int = 3
y := 5
const z = 7
fmt.println(s)
2.2 条件判断语句
Go的条件判断和C整体相同,除了不需要括号+强制格式化。此外,我们不需要在switch里面写无穷无尽的break了。
if x < 10 {
} else if x < 20 {
} else {
}
switch y {
case 1:
case 2:
case 3:
case 4, 5:
default:
}
2.3 循环语句
在Go中,只保留了for一个关键字,具体用法如下:
// 类似 while (true) 的死循环
for {
}
// 普通的while循环
for x != 5 {
if x == 7 {
break
}
}
// 传统for循环
for i := 0; i < n; i++ {
}
2.4 数组,切片与映射
切片类似C++中的vector,而映射就是C++中的unordered_map。他俩都是日常开发中最为常用的数据结构。
var a[10] int //一个长度为10的数组
var b[20][30] int //一个第一维20,第二维30的二维数组
c := []int{3, 4, 5} //一个切片
d := make([]int, 10) //一个长度为10的切片
var vis map[string]int //一个key为string,value为int的无序映射
2.5 函数
函数的写法比较普通,主要是习惯的区别:
// 普通的函数
func add(a int, b int) int {
return a + b
}
// 没有返回值的函数
func output(s string) {
fmt.println("hello, " + s)
}
// 可以一次返回多个值
func div(x int, y int) (a int, b int) {
a = x / y
b = x % y
return a, b //可省略
}
2.6 结构体
结构体的方式类似struct(他并不是传统的class对象,更类似C中的普通struct)
//定义
type person struct {
name string
age int
pet string
}
//方法
func (p person) String() string {
return fmt.Sprintf("name=%s age=%d pet=%s", p.name, p.age, p.pet)
}
//指针接收者方法
func (p *person) addAge() {
//虽然是指针,但是还是可以这么写,有点像语法糖?
p.age++;
}
三、使用Go编写一些小程序
今天的课程中,老师介绍了猜谜游戏,在线词典和SOCKET5代理。
猜谜游戏就是很朴素的一个循环,没啥说法(我一开始以为是要写一个二分查找来着,然后突然想起来这不是我们要负责的)。有一说一,这个流的用法还是挺有创意的,因为以前我更喜欢scanf。
在线词典需要使用网络部分,向指定的API端口发送请求,得到返回的JSON后对数据进行解析。由于网络出现异常的概率较高,我们还得留意异常处理,避免出现不可知的状况。课程中,老师给我们介绍了一个请求生成器,它可以大幅减少我们的代码工作量。