中文官网地址:Go语言中文网
官方文档地址:Go中文文档 (要学会查官方文档 ~ )
1. 基础语法
1.9 Map(映射)
类似于C++中的std::map或C中的哈希表,在Go语言中,Map也是一种将键映射到值的数据结构,它的创建和操作如下:
// 创建一个空Map,键的类型是string,值的类型是int
m := make(map[string]int)
// 存储键值对
m["one"] = 1
m["two"] = 2
1.10 Range(范围遍历)
Go语言中,Range用于循环遍历数组(slice)或Map中的元素。与其他编程语言中的范围遍历不同,Go语言中的Range返回索引和值(或键和值),而在C++中需要使用迭代器才能实现类似的功能。Range的用法如下:
arr := []int{1, 2, 3, 4, 5}
for index, value := range arr {
fmt.Println("索引:", index, "值:", value)
}
m := map[string]int{"one": 1, "two": 2, "three": 3}
for key, value := range m {
fmt.Println("键:", key, "值:", value)
}
1.11 函数(Function)
Go语言中函数可以返回多个值,第一个是实际的返回值,第二个往往是错误信息。注意函数的返回值在参数列表之后:
// 定义一个函数,接受两个整数并返回它们的和
func add(a, b int) (int, error) {
sum := a + b
if sum > 10 {
return sum, nil
} else {
return 0, errors.New("Sum is too small")
}
}
1.12 指针(Pointers)
Go语言支持指针,但相比C和C++操作相对受限,不能像C++那样进行复杂的指针算术运算。在Go中,要在函数内部修改变量,需要传递变量的地址,使用&符号:
func addToValue(val *int) {
*val += 2
}
func main() {
num := 5
addToValue(&num) // 传递num的地址
fmt.Println(num)
}
1.13 结构体
结构体是一种自定义的数据类型,支持定义一组不同类型的字段,每个字段都有自己的数据类型和名称。在Go语言中,结构体是一种重要的数据类型,是创建 模块(module) 的基础:
// 定义一个结构体类型
type User struct {
Name string
Password string
}
func main() {
// 使用结构体字面量初始化结构体变量
user1 := User{"Azure", "123456"}
// 也可以使用键值对的方式初始化部分字段
user2 := User{
Name: "Bob",
Password: "654321",
}
fmt.Println(user1)
fmt.Println(user2)
}
上面的代码定义了一个名为User的结构体类型,它有两个字段:Name和Password。可以使用结构体字面量来初始化结构体变量,同时指定每个字段的初始值,也可以只初始化结构体中的部分字段,未初始化的字段会使用其类型的零值。
结构体指针:
结构体也可以使用指针进行操作,使用结构体指针可以避免大结构体的拷贝开销,并且可以实现对结构体的修改:
func modifyUser(user *User, newName string) {
user.Name = newName
}
func main() {
user := User{Name: "Azure", Password: "123456"}
modifyUser(&user, "Alicia")
fmt.Println(user)
}
1.13 结构体方法
在Go语言中可以为结构体定义方法,类似于其他编程语言中的类成员函数,结构体方法支持为特定类型的值添加行为:
type User struct {
Name string
Password string
}
// 定义一个结构体方法
func (u User) CheckPassword(inputPassword string) bool {
return u.Password == inputPassword
}
func main() {
user := User{Name: "Azure", Password: "123456"}
// 调用结构体方法
result := user.CheckPassword("123456")
fmt.Println(result)
}
虽然方法可以在结构体的实例上调用,但是方法内部对结构体的修改不会影响原始结构体的值。如果你想要修改结构体内部的值,需要将结构体指针作为接收者。
补充:方法和函数的区别
Go语言中,为结构体定义的函数被称为方法,方法是与类型相关联的,只能在该类型的值上进行调用。而函数与任何特定的类型无关,它可以在任何地方调用,无论参数是什么类型。
心得
在这一小节中,学习了Go语言一些相对复杂的语法,在看学长们的代码时还是有点难以适应函数的写法,比如函数的返回值写在函数的参数表之后、可以有多个返回值、只有一个返回值的时候可以不打括号等等,每次看到都要反应一会儿。在项目的module目录下看到了很多以结构体来定义的数据模型,而这些数据模型又与数据库的表单设计关联紧密,渐渐地能看懂项目代码,把学到的知识应用起来还是挺开心的。多亲自上手敲代码熟悉语法,真的是学习一门新语言的最快最有效方法。
— — 笔记内容仅供参考,如有错误欢迎指出 — —