【2024-08-14】golang小题

67 阅读1分钟

一、顺序执行

func worker() chan int {
    ch := make(chan int)

    go func() {
       time.Sleep(3 * time.Second)
       ch <- 42
    }()

    return ch
}


func main() {
    timeStart := time.Now()

    _, _ = <-worker(), <-worker()

    println(int(time.Since(timeStart).Seconds()))
}

stackoverflow.com/questions/6…

赋值分为两个阶段。首先,左侧的索引表达式指针间接寻址(包括选择器中的隐式指针间接寻址)的操作数以及右侧的表达式均按通常顺序进行求值。其次,赋值按从左到右的顺序进行。

ch1, ch2 := worker(), worker()
_, _ = <-ch1, <-ch2

这样,输出将是(在Go Playground上尝试):

3

二、变量传递

func changePointer(p *int) {
    v := 3
    p = &v
}

func main() {
    v := 5
    p := &v
    println(*p)

    changePointer(p)
    println(*p)
}

输出是:
5和5
原因是:
golang只可以值传递,即使传递的是int指针,传递的也是拷贝出来的指针。

func changePointer(p *int) {
    *p = 3
}

func main() {
    v := 5
    p := &v
    println(*p)

    changePointer(p)
    println(*p)
}

把指针里的值改变成3,可以做到返回3