下面代码输出什么:
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 main
import (
"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 main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
// 使用 new() 创建一个指向结构体 Person 的指针
p := new(Person)
fmt.Printf("%#v\n", p) // 输出:&main.Person{Name:"", Age:0}
}
make:
- 仅用于创建并初始化切片、映射和通道。
- 用于分配并初始化内部数据结构,返回的是非零值。
- 主要用于分配引用类型的内存(如切片、映射和通道)。
package main
import "fmt"
func main() {
// 使用 make() 创建一个切片,并初始化长度为 3
s := make([]int, 3)
fmt.Printf("%#v\n", s) // 输出:[]int{0, 0, 0}
}