[学习] 分享几个学习中的小问题
defer 关键字
以下是一个简单的小 demo
package main
import "fmt"
func main() {
defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)
panic("error!")
}
// 3
// 2
// 1
// panic:error!
程序遇到 panic 时,会先依次执行 defer 然后再将 panic 传递出去。
for 循环中的临时变量
还是以一个小 demo 来练习
package main
import "fmt"
type student struct {
Name string
Age int
}
func initStudents() map[string]*student {
m := make(map[string]*student)
students := []student{
{Name: "jack", Age: 24},
{Name: "rose", Age: 23},
{Name: "wang", Age: 22},
}
for _, student := range students {
m[student.Name] = &student
}
return m
}
func main() {
students := initStudents()
for k, v := range students {
fmt.Println(k, *v)
}
}
// rose {wang 22}
// wang {wang 22}
// jack {wang 22}
for 循环遍历时,student 是一个临时变量,遍历过程中,在内存中的地址不变,赋值都是指向了同一个内存区域,导致后面的值其实都是一样的。
在 goroutine 中打印
package main
import (
"fmt"
"sync"
)
func main() {
wg := sync.WaitGroup{}
wg.Add(5)
for i := 0; i < 5; i++ {
go func() {
fmt.Println("i: ", i)
wg.Done()
}()
}
wg.Wait()
}
// 5
// 5
// 5
// 5
// 5
在 go 关键字后创建了一个匿名函数,同时它也是一个闭包,代码块中的 i 是对外部变量 i 的引用,go 关键字开启 goroutine 执行闭包,意味着它不会顺序执行,一般等该代码片段被调度器执行的时候,for 循环已经退出,此时 i 为 5,所以会在控制台打印出 5 个 5。
结构体组合
package main
import "fmt"
type People struct{}
func (p *People) ShowA() {
fmt.Println("showA")
p.ShowB()
}
func (p *People) ShowB() {
fmt.Println("showB")
}
type Teacher struct {
People
}
func (t *Teacher) ShowB() {
fmt.Println("teacher showB")
}
func main() {
t := Teacher{}
t.ShowA()
t.ShowB()
}
// showA
// showB
// teacher showB
go 中没有继承,只有组合,Teacher 中的 People 是一个匿名对象,通过它调用的函数都是自身的。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: