题目

1 写出以下逻辑,要求每秒钟调用一次proc并保证程序不退出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

func main() {
    go func() {
        // 1 在这里需要你写算法
        // 2 要求每秒钟调用一次proc函数
        // 3 要求程序不能退出
    }()

    select {}
}

func proc() {
    panic("ok")
}

2 下面代码写法有什么问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import (
    "fmt"
)
type Stduent struct {
    Age int
}
func main() {
    kv := map[string]Stduent{"menglu": {Age: 21}}
    kv["menglu"].Age = 22
    s := []Stduent{{Age: 21}}
    s[0].Age = 22
    fmt.Println(kv, s)
}

答案

1.写出以下逻辑,要求每秒钟调用一次proc并保证程序不退出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func main() {
    go func() {
        for {
            time.Sleep(time.Second)
            func() {
                defer func() {
                    if err := recover(); err != nil {
                        fmt.Println("捕获异常:", err)
                    }
                }()
                proc()
            }()
        }
    }()

    select {}
}

func proc() {
    panic("ok")
}

2 kv["menglu"].Age = 22会报错,不能修改Age,cannot assign to struct field kv["menglu"].Age in map
map中struct不能修改值的原因是struct类型是值类型。考虑以下情况:

1
2
stu1 := Student{Name:"Mike", Age: 21}
kv := map[string]Student{"Mike": stu1}

我们定义了一个map,这个map的主要作用就是可以通过人的名字来直接取得该名字对应的个人信息。现在我们要修改stu1的年龄,但是由于struct是值类型,也就是在赋值给kv的时候进行了值拷贝,存在kv中的只是stu1的一份拷贝,所以通过修改kv中的对象,并不能达到修改stu1的目的。
题外话:关于struct值传递有另外一个坑就是,对于声明了指针接收者方法的结构体,是不能直接赋值给接口的。