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
}