**1**.简述golang中make和new的区别
make用于内建类型(只能用于创建map、slice 和channel)的内存分配。并且返回一个有初始值(非零)的T类型,而不是*T。
new用于各种类型的内存分配。new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:**new返回指针**。
**2**.简要描述go中的main和init函数的区别
首先,这两个函数应用位置不同,init函数可以应用于所有的package,main只能应用于 package main,需要注意的是虽然一个package中可以写任意多个init,但是无论是从可读性还是可维护性来说,都是不推荐的;
其次,这两个函数定义时都不能有任何的参数和返回值,
最后,个人理解,init函数为初始化操作,main函数为程序入口。
一图胜千言
![image.png](https://static.studygolang.com/180115/1dead564cd51b084bd460252065ff342.png)
**3**.写出下面代码的输出结果
```go
package main
import (
"fmt"
)
type student struct {
Name string
Age int
}
func main() {
m :=pase_map()
for k,v :=range m {
fmt.Printf("key = %s,value =%v\n",k,v)
}
}
func pase_map() map[string]*student{
m :=make(map[string]*student)
stu :=[]student{{"joy",12},{"lei",14}}
for _,v :=range stu{
m[v.Name]=&v
}
return m
}```
**解题思路**:pase_map返回了一个key为string,值为*student的map,遍历结果应为map的key和value,主要误区在m中,value的值都为&{lei 14},这也是我所不能理解的,感觉进了思维误区,求大神指点
**4**.通道选择器中的panic问题
```go
package main
import "fmt"
var c1 = make(chan int,1)
var c2 = make(chan string,1)
func main() {
c1 <-1
c2 <-"hello"
select {
case v1 := <-c1:
fmt.Println(v1)
case v2 := <-c2:
panic(v2)
}
}
```
不一定会引起恐慌,可能会打印1,也可能会恐慌
**5**.协程交替执行,使其能顺序输出1-20的自然数
```go
package main
import (
"fmt"
"time"
)
func main() {
for i:=1;i<=10;i++ {
go func(i int) {
fmt.Println(2*i-1)
}(i)
}
for i:=1;i<=10;i++ {
go func(i int) {
fmt.Println(2*i)
}(i)
}
time.Sleep(3*time.Second)
}
```
有疑问加站长微信联系(非本文作者))