Go 语言入门指南:基础语法和常用特性解析(三) | 青训营

73 阅读4分钟

中文官网地址: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的结构体类型,它有两个字段:NamePassword。可以使用结构体字面量来初始化结构体变量,同时指定每个字段的初始值,也可以只初始化结构体中的部分字段,未初始化的字段会使用其类型的零值。

结构体指针:

  结构体也可以使用指针进行操作,使用结构体指针可以避免大结构体的拷贝开销,并且可以实现对结构体的修改:

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目录下看到了很多以结构体来定义的数据模型,而这些数据模型又与数据库的表单设计关联紧密,渐渐地能看懂项目代码,把学到的知识应用起来还是挺开心的。多亲自上手敲代码熟悉语法,真的是学习一门新语言的最快最有效方法。

— — 笔记内容仅供参考,如有错误欢迎指出 — —