go语言的坑

go语言在for循环中遍历的临时变量地址是一样的

func main() {
    //SetLogConfToEtcd()
    for i := 0; i < 5; i++ {
        a := i
        fmt.Printf("%p
", &i)  //可以看到i的地址都是一样的,也就是说i是复用的
        fmt.Printf("%p
", &a) //如果需要将遍历的变量地址赋值传给别的变量,可以在循环中声明一个新的临时变量来接受
    }
}
0xc0000ce7e8
0xc0000ce7f0
0xc0000ce7e8
0xc0000f2008
0xc0000ce7e8
0xc0000f2010
0xc0000ce7e8
0xc0000f2018
0xc0000ce7e8
0xc0000f2020

go语言中 go协程生成的子协程并不会随着父协程的的退出而结束,只要main不退出,所以在协程中return之前,先想办法把子协程关了

package main

import (
    "fmt"
    "os"
    "os/signal"
    "time"
)

func main() {
    go func() {
        go func() {
            time.Sleep(10 * time.Second)
            fmt.Println("当前子携程退出")
        }()
        fmt.Println("当前携程退出")
        return
    }()
    ch := make(chan os.Signal)
    signal.Notify(ch)
    fmt.Println(<-ch)
}

image-20191216191204343





原文地址:https://www.cnblogs.com/hualou/p/12069688.html