Go的面试题

网址题目 https://blog.csdn.net/weiyuefei/article/details/77963810
做的答案 【Go的面试题】1.defer后入先出panic在defer之后进行执行
原因出现panic恐慌时候,会先按照defer的后入先出的顺序执行,最后才会执行panic。
2.结构体中套入一个结构体就实现了继承
3.地址与变量
第一个:go func中i是外部for的一个变量,地址不变化,遍历完成后,最终i=10, 故go func执行时,i的值始终是10。过程中的i对应的地址与协程中的地址不是一个,所以不对应。
第二个:go func中i是函数参数,与外部for中的i完全是两个变量。 尾部(i)将发生值拷贝,每次拷贝一个新值,使用过程中的量

func main() { runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} wg.Add(20) for i := 0; i < 10; i++ { go func() { fmt.Println("A: ", i) wg.Done() }() } for i := 0; i < 10; i++ { go func(i int) { fmt.Println("B: ", i) wg.Done() }(i) } wg.Wait() }

5.select
  • select 中只要有一个case能return,则立刻执行。
  • 当如果同一时间有多个case均能return则伪随机方式抽取任意一个执行。
  • 如果没有一个case能return则可以执行”default”块。
6.defer
package main// 在这个例子中,我们将看到如何使用 Go 协程和通道实现一个工作池 。import "fmt"func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret } func main() { a := 1 b := 2 defer calc("1", a, calc("10", a, b)) a = 0 defer calc("2", a, calc("20", a, b)) b = 1 } // 10 1 2 3 // 20 0 2 2 // 2 0 2 2 // 1 1 3 4 // defer是一个栈的结构前面的就是进来了数值已经锁定了

7.make
func main() { s := make([]int, 5) s = append(s, 1, 2, 3) fmt.Println(s) }[0 0 0 0 0 1 2 3]s := make([]int, 0) s = append(s, 1, 2, 3) fmt.Println(s)//[1 2 3]


    推荐阅读