[学习] 分享几个学习中的小问题

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 协议》,转载必须注明作者和本文链接
Hello。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!