Go语言基础入门(下) | 青训营笔记

110 阅读4分钟

Go语言基础入门(下) | 青训营笔记

[第六届青训营] 笔记创作第二篇

目录

  • Range遍历
  • Switch分支
  • 函数
  • 错误处理
  • 结构体

Go语言基本语法

Range遍历

range 是 go 语言中用于迭代各种各样的数据结构,下面举几个例子看看如何在之前学习过的数据结构上使用 range 进行遍历。 使用 range 来对 slice 中的元素求和。 数组也可以用这种方法初始化并赋初值。 range 在数组和 slice 中提供对每项的索引和值的访问,也就是通过range返回的第一个值对应索引,第二个值对应。因为这里不需要索引信息,所以我们使用空白标识符 _ 将其忽略。 当需要这个索引的时候用相应变量存储下来即可。 range 在 map 中迭代键值对,当然 range 也可以只遍历 map 的键。

    nums := []int{2, 3, 4}
    sum := 0
    for _, num := range nums {
        sum += num
    }
    fmt.Println("sum:", sum)

    kvs := map[string]string{"a": "apple", "b": "banana"}
    for k, v := range kvs {
        fmt.Printf("%s -> %s\n", k, v)
    }

    for k := range kvs {
        fmt.Println("key:", k)
    }

    for i, c := range "go" {
        fmt.Println(i, c)
    }

Switch分支

switch 是多分支情况时快捷的条件语句。 在同一个 case 语句中可以使用逗号来分隔多个表达式。不带表达式的 switch 是实现 if/else 逻辑的另一种方式, case 表达式也可以不使用常量。 Go语言中的switch分支语句与其他语言略有不同,在其它语言中,若case语句结束时若没有break结尾,则会执行顺次执行接下来的case语句。而在Go语言中,不需要添加break,默认执行对应的case语句后退出。

    i := 2
    switch i {
    case 1:
        fmt.Println("one")
    case 2:
        fmt.Println("two")
    case 3:
        fmt.Println("three")
    }

    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("It's before noon")
    default:
        fmt.Println("It's after noon")
    }

    i := 5
    switch i {
    case 1: fmt.PrintLn("1")
    case 5 : fmt.PrintLn("5")
    case 4 : fmt.PrintLn("4")
    case 3 : fmt.PrintLn("3")
    case 2 : fmt.PrintLn("2")
    default: fmt.PrintLn("others")
}

函数

Go语言中的函数与其他语言中的函数概念是类似的,所谓函数就是程序将可以执行某个功能的代码段所封装起来的东西,以便在运行过程中反复调用。

如这里是一个函数,接受两个 int 并且以 int 返回它们的和。注意:Go 需要明确的 return,也就是说,它不会自动 return 最后一个表达式的值。

func plus(a int, b int) int {
    return a + b
}

当多个连续的参数为同样类型时, 可以仅声明最后一个参数的类型,忽略之前相同类型参数的类型声明。

func plusPlus(a, b, c int) int {
    return a + b + c
}

Go 原生支持多返回值,这个特性在 Go 语言中经常用到,例如用来同时返回一个函数的结果和错误信息。如这里(int, int) 在这个函数中标志着这个函数返回 2 个 int。

func vals() (int, int) {
    return 3, 7
}

错误处理

符合 Go 语言习惯的做法是使用一个独立、明确的返回值来传递错误信息。 这与 Java、Ruby 使用的异常(exception) 以及在 C 语言中有时用到的重载 (overloaded) 的单返回/错误值有着明显的不同。 Go 语言的处理方式能清楚的知道哪个函数返回了错误,并使用跟其他(无异常处理的)语言类似的方式来处理错误。

按照惯例,错误通常是最后一个返回值并且是 error 类型,它是一个内建的接口。 errors.New 使用给定的错误信息构造一个基本的 error 值,返回错误值为 nil 代表没有错误。

func f1(arg int) (int, error) {
    if arg == 42 {

        return -1, errors.New("can't work with 42")

    }

    return arg + 3, nil
}

结构体

Go 的结构体(struct) 是带类型的字段(fields)集合。 这在组织数据时非常有用。 这里构建一个person结构体,person 结构体包含了 name 和 age 两个字段。写一个 newPerson 函数,作用是使用给定的名字构造一个新的 person 结构体。这里可以安全地返回指向局部变量的指针, 因为局部变量将在函数的作用域中继续存在。

type person struct {
    name string
    age  int
}

func newPerson(name string) *person {

    p := person{name: name}
    p.age = 42
    return &p
}