这是我参与「第五届青训营」笔记创作活动的第1天
一. 重点内容
-
Go语言介绍
-
Go语言基础语法
-
Go实战案例
二. 知识点介绍
1. Go语言介绍
- 高性能、高并发:Go语言有着与C++和Java语言媲美的性能,使用标准库或者基于标准库的第三方库即可开发高并发应用程序。
- 语法简单,学习曲线平缓:Go语言语法风格类似于C语言,并进行了大幅度的简化,所以Go语言易上手,学习期较短。代码例如:
package main
import (
"net/http"
)
// 两行关键代码即创建可承载静态文件访问的支持高并发高性能的服务器
func main() {
// 在http包里创建一个路由,指向一个静态文件
http.Handle("/", http.FileServer(http.Dir(".")))
// 启动服务器,端口为8080
http.ListenAndServe(":8080", nil)
}
- 丰富的标准库:Go语言和Python语言一样有着丰富的标准库,大大降低了学习和使用成本。
- 完整的工具链:编译、代码格式化,错误检查等都有对应的工具,并且Go语言内置单元测试框架,支持单元测试、性能测试及性能优化等。
- 静态链接:Go语言的默认编译结构是静态链接,执行唯一的可执行文件即可运行,部署方便快捷。
- 快速编译:Go语言在静态语言里面拥有几乎最快的编译速度,可在短时间内实现增量编译。
- 跨平台:Go语言可在Windows、Linux等系统下运行,也能够用来开发Android、iOS软件。
- 垃圾回收:垃圾回收机制与Java类似,由系统自动回收。
2. Go语言基础语法
- 变量声明:(1)
var number = 3orvar number int = 3(2)number := float(e) - if/else语句:(1) 条件语句不需要括号 (2) if语句后的同一行要接'{'
if 7%2 == 0 {
fmt.Println("7 is odd")
} else {
fmt.Println("7 is even")
}
- for循环[无其他循环]:
for i := 1; i < 9; i++ {
fmt.Printlin(i)
}
- switch语句:不需要添加break语句
number := 2
swtich number {
case 1:
fmt.Println("ONE")
case 2:
fmt.Println("Two")
default:
fmt.Println("OTHER")
}
- 数组定义:(1)
var arr int[5]orarr := [5]int{1, 2, 3, 4, 5} - 切片[常用]:长度可变的数组。
// 定义切片: 函数make(type, length)
s := make([]string, 3)
// 添加元素: 函数append(source, value1, value2...)
s.append(s, "d", "e", "f")
// 复制数组:函数copy(destination, source)
o := make([]string, len(s))
copy(o, s)
- map:
// map的第一种定义方式
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
// 第二种
m2 := map[string]int{"one":1, "two":2}
// 第三种
var m3 = map[string]int{"one":1, "two":2}
- range:
// 使用range遍历数组
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
sum += num
}
// 使用range遍历map
s := map[string]string{"a":"A", "b":"B"}
for k, v := range s {
fmp.Println(k, ":", v)
}
- 函数func:变量类型后置
func function_name(input_var1 type1, input_var2 type2) (return_var1 type3, return_var1 type4)
- 指针:对传入的参数进行有效修改
- 结构体&&结构体方法:带指针或者不带指针皆可
func (u user) function_name(var input_type) return type
func (u *user) function_name(var input_type) return type
- Json处理:可用Json.Marshal()函数序列化一个结构体,注意判断error,打印时需要转换为string类型,否则会打印出16进制的数字序列。可用Json.Unmarshal()函数反序列化,将数据传递给一个空的结构体。
- 数字解析:需要导入"strconv"包
- 进程信息:需要导入"os"及"os/exec"包
三. 实践练习例子
1. 猜谜游戏 - 生成随机数
- 需要导入"math/rand"包,利用rand.Intn(maxNumber)函数生成0-maxNumber内的随机数
- 如果想要每次生成的随机数不一样,需要导入"time"包,使用时间戳初始化随机数种子
rand.Seed(time.Now().UnixNano())
- 从键盘读取输入,需要导入"bufio"包及"os"包,例如
reader := bufio.newReader(os.Stdin)
input, err := reader.ReadString('\n')
- 需要使用strings.TrimSuffix(input, '\n')去掉换行符,才能用strconv.atoi()函数转化成整数
2. 命令行词典
简单地生成网页request:
- 右键点击Tab - dict, 选择Copy -> Copy as cURL(bash)
- 将复制的内容粘贴至Bash命令框中,复制生成的所有代码
- 将代码粘贴至curlconverter.com/#go
- 生成request body,用Json.marshal()序列化request
- 解析response body, 右键Copy object复制Preview里的内容,粘贴至oktools.net/json2go
- 点击转换 - 嵌套,用Jason.Unshal()反序列化,将数据传入生成的新的结构体
- 注意添加response的status code的检查,防止网页返回的数据出错
四. 个人课后总结
Go语言很像C语言,又有点像Python语言,需要对Go语言的语法十分熟悉,以免混淆。另外,Go语言相比其他语言,多出了一个切片概念,类似于动态数组,要格外注意。在Go中,很多时候变量类型的声明不同于C语言,需要将变量类型后置,而非前置。创建复杂类型时,要判断是否发生了错误,若发生错误,需要 panic(err),若没有错误,才能输出或者使用该数据。在从键盘读取数据的时候,Go语言的语法要稍微比Python、C语言复杂一些。