下面代码输出什么:
func main() {slice := []int{0,1,2,3}m := make(map[int]*int)for key,val := range slice {m[key] = &val}for k,v := range m {fmt.Println(k,"->",*v)}
}
答案:
0 -> 3
1 -> 3
2 -> 3
3 -> 3
原因:在循环中,val 是一个在每次迭代中被重用的变量。因此,每个映射项实际上都引用相同的val的地址,这意味着它们最终都指向切片的最后一个元素。
package mainimport ("fmt")func main() {defer_call()}func defer_call() {defer func() { fmt.Println("打印前") }()defer func() { fmt.Println("打印中") }()defer func() { fmt.Println("打印后") }()panic("触发异常")
}
打印后
打印中
打印前
panic: 触发异常
参考解析:defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic
// 1.func main() {s := make([]int, 5)s = append(s, 1, 2, 3)fmt.Println(s)}// 2.func main() {s := make([]int,0)s = append(s,1,2,3,4)fmt.Println(s)
}
[0 0 0 0 0 1 2 3]
[1 2 3 4]
- 下面这段代码有什么缺陷:
func funcMui(x,y int)(sum int,error){return x+y,nil}
参考答案:第二个返回值没有命名。
参考解析:
在函数有多个返回值时,只要有一个返回值有命名,其他的也必须命名。如果有多个返回值必须加上括号();如果只有一个返回值且命名也必须加上括号()。这里的第一个返回值有命名 sum,第二个没有命名,所以错误。
- new和make
new:- 用于创建并返回一个指向新分配类型的零值的指针。
- 不会初始化内存,只是分配零值。
- 主要用于分配内存给值类型(如结构体、整数、浮点数等)并返回指向该值类型的指针。
package mainimport "fmt"type Person struct {Name stringAge int
}func main() {// 使用 new() 创建一个指向结构体 Person 的指针p := new(Person)fmt.Printf("%#v\n", p) // 输出:&main.Person{Name:"", Age:0}
}
make:
- 仅用于创建并初始化切片、映射和通道。
- 用于分配并初始化内部数据结构,返回的是非零值。
- 主要用于分配引用类型的内存(如切片、映射和通道)。
package mainimport "fmt"func main() {// 使用 make() 创建一个切片,并初始化长度为 3s := make([]int, 3)fmt.Printf("%#v\n", s) // 输出:[]int{0, 0, 0}
}