这是我参与「第五届青训营」伴学笔记创作活动的第 1 天
1. 概述
我将主要介绍如下知识点:
-
Go 语言开发环境配置
-
Go 语言基础语法
-
Go 语言标准库
2. 开发环境配置
2.1 安装 Golang
访问 go.dev/ ,点击 Download ,下载对应平台安装包,安装即可,我这里选择的是 windows 的压缩包,大家可根据自己的具体情况选择
2.2 配置集成开发环境
可以选择安装 VS Code , 或者 Goland ,对于 VS Code,需要安装 Go 插件
我这里选择的是 Goland,也建议新手选择 Goland
3. 基础语法
3.1 入门案例—Hello World
代码:
package main
import "fmt"
func main() {
fmt.Println("hello,world!")
}
package main 表示文件所在的包是 main
import “fmt” 表示引入一个包,包名fmt,引入该包以后就可以使用 fmt 包的函数
func 是一个关键字,表示一个函数
执行:
- 可以使用 go build 命令
- 还可以直接使用 go run 命令直接执行 go 源文件
3.2 变量
go语言是一门强类型语言,每一个变量都有它自己的变量类型。常见的变量类型包括字符串、整型、浮点型、布尔型等。
声明变量:
var a int // 创建类型为 int 的变量
var b, c float64 = 1.1, 2.1 // 同时声明多个变量
var d = "init" // 若未指明变量类型但赋了值,Go语言会自动推断类型
e := true // 也可直接用等号声明并赋值
3.3 选择语句
if else:if 后面没有括号,且 if 下方的语句必须用大括号包裹
switch:匹配项后面不需要再加 break
特别说明:GO 语言不支持三元运算符
代码:
// if else
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
// switch
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
3.4 循环语句
在go里面没有 while 循环、do while 循环,只有唯一的一种 for 循环
// 死循环 + break
for {
fmt.Println("loop")
break
}
// for-range 方式
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
3.5 数组和切片
数组的定义: var 数组名 [数组大小]数据类型
var a [5]int
a[4] = 1 // 赋值
在真实业务代码里面,我们很少直接使用数组,因为它长度是固定的,我们用的更多的是切片(slice)
切片是引用类型,其长度是可以变化的,因此它是一个可以动态变化数组
切片的使用:
// 使用 make 创建切片
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
// 使用 append 对切片进行动态追加
s = append(s, "d") // 注意必须把 append 的值赋值回原数组!
fmt.Println(s) // [a b c d]
fmt.Println(s[2:]) // [c d]
// 使用 copy 拷贝切片
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d]
// 定义切片时也可直接指定具体的数组
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
3.6 映射
map是key-value数据结构,类似其它编程语言的哈希或字典,是实际使用过程中最频繁用到的数据结构 ,map的 key-value是无序
map 的声明: m := make(map[keytype]valuetype)
map的使用:
m := make(map[string]int) // make的作用就是给map分配数据空间
// map 的增改
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
// map 的查找
val, ok := m["unknow"]
fmt.Println(val, ok) // 0 false
// map 的删除
delete(m, "one")
// map 的遍历
for k, v := range m {
fmt.Println(k, v) // two 2
}
3.7 函数
Golang 和其他很多语言不一样的是,变量类型是后置的。其函数形参名在前,形参类型在后
如下示例 Golang 里面一个简单的实现两个变量相加的函数:
func add(a int, b int) int {
return a + b
}
3.8 指针
go里面也支持指针。但是相比 C 和 C++ 里面的指针,支持的操作很有限
指针的一个主要用途就是对于传入参数进行修改,代码示例如下:
func addptr(n *int) {
*n += 2
}
func main() {
n := 5
addptr(&n)
fmt.Println(n) // 7
}
3.9 结构体
结构体是带类型的字段的集合
比如这里 user 结构包含了两个字段,name 和 password
type user struct {
name string
password string
}
我们可以用结构体的名称去初始化一个结构体变量,构造的时候需要传入每个字段的初始值。也可以用键值对的方式去指定初始值,这样可以只对一部分字段进行初始化
同样,结构体也支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构体的拷贝开销
同时,在 Golang 里面可以为结构体定义一些方法,Golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是 struct
a := user{name: "wang", password: "1024"}
c := user{name: "wang"}
c.password = "1024"
var d user
d.name = "wang"
d.password = "1024"
// 调用方法
fmt.Println(checkPassword2(&a, "haha")) // false
// 结构体方法
func checkPassword2(u *user, password string) bool {
return u.password == password
}
3.10 错误处理
Go语言不支持传统的 try catch finally 这种处理异常处理机制
Go中引入的处理方式为: defer , panic , recover,即Go中可以抛出一个panic异常,然后在defer中通过recover捕获这个异常,然后正常处理
Go程序中,也支持自定义错误, 使用 errors.New 和 panic 内置函数
defer func() {
err := recover() // recover()内置函数,可以捕获到异常
if err != nil { // 说明捕获到错误
fmt.Println("err=", err)
}
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res=", res) // err= runtime error: integer divide by zero
4. 标准库
4.1 字符串操作
在标准库 strings 包里面有很多常用的字符串工具函数。比如:
contains: 判断一个字符串里面是否有包含另一个字符串
count: 字符串计数
index: 查找某个字符串的位置
join: 连接多个字符串
repeat: 重复多个字符串
replace: 替换字符串
除此之外,在标准库的 fms 包里面有很多常用的字符串格式化 相关的方法,感兴趣的读者可自行查阅
4.2 时间处理
时间和日期相关函数,需要导入 time 包
在go语言里面最常用的就是 time.now() 来获取当前时间
也可以用 time.Format() 格式化日期时间
t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
fmt.Println(t) // 2022-03-27 01:25:36 +0000 UTC
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 2022 March 27 1 25
fmt.Println(t.Format("2006-01-02 15:04:05")) // 2022-03-27 01:25:36
4.3 字符串类型转换
在 go 语言当中,关于字符串和数字类型之间的转换都在 strconv(string convert) 这个包下,我们可以用 ParseInt 或者 ParseFloat 来解析一个字符串
n, _ := strconv.ParseInt("111", 10, 64)
fmt.Println(n) // 111
4.4 获取进程信息
在 go 里面,我们能够用 os.Args 来得到程序执行的时候的指定的命令行参数
5. 总结
内容较多,需课后慢慢消化
参考:
- 字节内部课:GO基础语法
- Go 语言教程 | 菜鸟教程 (runoob.com)