0%

Golang 面试题·卷三

线上测试地址:https://play.studygolang.com/

1、下面代码能运行吗?为什么?(20分)

1
2
3
4
5
6
7
8
9
10
type Param map[string]interface{}

type Show struct {
Param
}

func main1() {
s := new(Show)
s.Param["RMB"] = 10000
}
参考答案

结果:

1
2
3
4
5
panic: assignment to entry in nil map

goroutine 1 [running]:
main.main()
/tmp/sandbox845633960/prog.go:11 +0x40

map、slic、channel 需要初始化才可以使用,
题目中中的s.Param 并没有进行初始化。

2.请说出下面代码存在什么问题?(20分)

1
2
3
4
5
6
7
8
9
10
type student struct {
Name string
}

func zhoujielun(v interface{}) {
switch msg := v.(type) {
case *student, student:
msg.Name
}
}
参考答案

结果:

1
./prog.go:10:6: msg.Name undefined (type interface {} is interface with no methods)

解析:

msg.Name 不是方法,不可单独使用。

3.写出打印的结果?(20分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type People struct {
name string `json:"name"`
}

func main() {
js := `{
"name":"11"
}`
var p People
err := json.Unmarshal([]byte(js), &p)
if err != nil {
fmt.Println("err: ", err)
return
}
fmt.Println("people: ", p)
}
参考答案

结果:

1
people:  {}

解析:

这个是因为 People struct 的字段 name 为小写,不能被外部包使用,所以json.Unmarshal()时,json包不可以进行映射。

1
./prog.go:9:2: struct field name has json tag but is not exported

4.下面的代码有问题吗?(20分)

1
2
3
4
5
6
7
8
9
10
11
12
type People struct {
Name string
}

func (p *People) String() string {
return fmt.Sprintf("print: %v", p)
}

func main() {
p := &People{}
p.String()
}
参考答案

结果:

1
2
runtime: goroutine stack exceeds 250000000-byte limit
fatal error: stack overflow

解析:

fmt.Sprintf(“print: %v”, p) 会调用p.String()方法,造成循环调用,引起栈溢出。

5.下面代码有没有问题,有的话问题在哪里?(20分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func main() {
ch := make(chan int, 1000)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
}()
go func() {
for {
a, ok := <-ch
if !ok {
fmt.Println("close")
return
}
fmt.Println("a: ", a)
}
}()
close(ch)
fmt.Println("ok")
time.Sleep(time.Second * 100)
}
参考答案

等待更新…

6.请说明下面代码书写是否正确?(20分)

1
2
3
4
5
6
7
8
9
10
var value int32

func SetValue(delta int32) {
for {
v := value
if atomic.CompareAndSwapInt32(&value, v(v+delta)) {
break
}
}
}
参考答案

等待更新…

7.下面的程序运行后为什么会爆异常?(20分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
type Project struct{}

func (p *Project) deferError() {
if err := recover(); err != nil {
fmt.Println("recover: ", err)
}
}

func (p *Project) exec(msgchan chan interface{}) {
for msg := range msgchan {
m := msg.(int)
fmt.Println("msg: ", m)
}
}

func (p *Project) run(msgchan chan interface{}) {
for {
defer p.deferError()
go p.exec(msgchan)
time.Sleep(time.Second * 2)
}
}

func (p *Project) Main() {
a := make(chan interface{}, 100)
go p.run(a)
go func() {
for {
a <- "1"
time.Sleep(time.Second)
}
}()
time.Sleep(time.Second * 100000000000000)
}

func main() {
p := new(Project)
p.Main()
}
参考答案

等待更新…

8.下面的代码有没有错误,有的话错在哪里?(20分)

1
2
3
4
5
6
7
8
9
10
11
func Foo(x interface{}) {
if x == nil {
fmt.Println("empty interface")
return
}
fmt.Println("non-empty interface")
}
func main() {
var x *int = nil
Foo(x)
}
参考答案

等待更新…

9.请说出下面代码,执行时为什么会报错?(20分)

1
2
3
4
5
6
7
8
type Student struct {
name string
}

func main() {
m := map[string]Student{"people": {"zhoujielun"}}
m["people"].name = "wuyanzu"
}
参考答案

结果:

1
./prog.go:9:19: cannot assign to struct field m["people"].name in map

解析:

原因是 map 元素是无法取址的,也就说可以得到 m[“people”], 但是无法对其进行修改。

解决办法:使用指针的map,map[string]*Student

10.请说出下面的代码存在什么问题?(20分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type query func(string) string

func exec(name string, vs ...query) string {
ch := make(chan string)
fn := func(i int) {
ch <- vs[i](name)
}
for i, _ := range vs {
go fn(i)
}
return <-ch
}

func main() {
ret := exec("111", func(n string) string {
return n + "func1"
}, func(n string) string {
return n + "func2"
}, func(n string) string {
return n + "func3"
}, func(n string) string {
return n + "func4"
})
fmt.Println(ret)
}
参考答案

等待更新…