[Go基础语法 | 青训营笔记]

48 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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后对数据进行解析。由于网络出现异常的概率较高,我们还得留意异常处理,避免出现不可知的状况。课程中,老师给我们介绍了一个请求生成器,它可以大幅减少我们的代码工作量。