Go 入门系列
基础篇二
1. 函数
函数是 Go 的中心. (在其他一些语言中函数也是重中之重)
package main
import "fmt"
func main() {
// 调用 add 函数
res := add(3, 5)
fmt.Println("3+5=", res)
// 调用 add 函数, 使用 vals 函数的两个返回值作为参数
fmt.Println("===", add(vals()))
// 忽略第一个返回的参数
_, c := vals()
fmt.Println("c = ", c)
}
func add(a int, b int) int {
return a + b
}
// 定义一个函数 返回两个值
func vals() (int, int) {
return 3, 7
}
上述函数不仅仅可以返回多个值
Go 中函数允许 可变长参数
类比java 中的可变参数
func main() {
sum(1, 2, 3)
k := make([]int, 3)
k[0] = 3
k[1] = 4
k[2] = 5
// 传入一个 slice
sum(k...)
}
// 可变参数函数
func sum(nums ...int) {
fmt.Println(nums, " ")
total := 0
for _, num := range nums {
total += num
}
fmt.Println(total)
}
2. 闭包
Go 支持通过 闭包来使用 匿名函数.
通过闭包隐藏变量 i
package main
import "fmt"
func intSeq() func() int {
i := 0
return func() int {
i += 1
return i
}
}
func main() {
// nextInt 是一个函数
nextInt := intSeq()
// 调用这个函数 返回 ++i 的值
fmt.Println(nextInt())
fmt.Println(nextInt())
fmt.Println(nextInt())
}
3. 指针
Go 支持指针, 允许在程序中通过引用传递值 或数据结构
func zeroval(ival int) {
ival = 0
}
func zeroptr(iptr *int) {
*iptr = 0
}
func main() {
i := 1
fmt.Println("init value:", i)
// 值传递, 不影响 此处 i 的值
zeroval(i)
fmt.Println("zeroval:", i)
// 将 i 的地址传递到 zeroptr 函数, 该函数就能修改 此处 i 的值为0
zeroptr(&i)
fmt.Println("zeroval:", i)
}
4. 结构体
type person struct {
name string
age int
}
func main() {
fmt.Println(person{"Bob", 20})
fmt.Println(person{name: "Alice", age: 20})
s := person{name: "Tom", age: 33}
fmt.Println(s.name, ":", s.age)
// ptr 为 s 的指针, 指针也会被自动解引用.
var ptr *person = &s
fmt.Println(ptr.name)
}