for range
Q:以下代码输出什么?
package main
import (
"fmt"
)
type student struct {
Name string
Age int
}
func pase_student() map[string]*student {
m := make(map[string]*student)
stus := []student{
{Name: "zhou", Age: 24},
{Name: "li", Age: 23},
{Name: "wang", Age: 22},
}
// stu 是一个变量,其地址(&stu)为系统分配,值分别为上述三个
for _, stu := range stus {
m[stu.Name] = &stu
}
return m
}
func main() {
students := pase_student()
for k, v := range students {
fmt.Printf("key=%s,value=%v \n", k, v)
}
}
//output
//key=zhou,value=&{wang 22}
//key=li,value=&{wang 22}
//key=wang,value=&{wang 22}
channel
Q:下列如何执行?
m := make(chan struct{})
go func() {
for {
select {
case v, ok := <-m:
fmt.Println(v, ok)
default:
fmt.Println("def")
}
}
}()
time.Sleep(1 * time.Microsecond)
m <- struct{}{}
time.Sleep(1 * time.Microsecond)
close(m)
time.Sleep(1 * time.Microsecond)
// output:
def
def
...
{} true
def
def
...
{} false
{} false
...
误解:close chan 后执行 default
正解:chan 里无,则执行 default ,chan 里有,执行对应 case ,close chan 后,取到的是默认值,且为 false
defer / 闭包
Q: 以下代码输出什么?
package main
import "fmt"
func main(){
for i:=0;i<5;i++{
defer func(){
fmt.Print(i)
}()
}
}
//output
//55555