01
一个函数内defer的执行程序与其申明程序相同呈现panic语句时,会先执行defer后执行panic呈现panic语句时,申明在panic前面的任何代码不再执行
package mainimport( "fmt")func main(){ defer func(){fmt.Println("打印前")}() defer func(){fmt.Println("打印中")}() defer func(){fmt.Println("打印后")}() panic("完结")}
$ go run main.go 打印后打印中打印前panic: 完结
02
for range 循环的时候会创立每个元素的正本,而不是元素的援用所以 m[key] = &val 取的都是变量 val 的地址所以最初 map 中的所有元素的值都是变量 val 的地址,因为最初 val 被赋值为3,所有输入都是3
package mainimport( "fmt")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) } }
$ go run main.go 0 -> 31 -> 32 -> 33 -> 3
03
// 上面两段代码输入什么// 1. func main() { s := make([]int, 5) s = append(s, 1, 2, 3) fmt.Println(s) }// [0,0,0,0,0,1,2,3]// 2. func main() { s := make([]int,0) s = append(s,1,2,3,4) fmt.Println(s)}// [1,2,3,4]
// 上面这段代码有什么缺点func funcMui(x,y int)(sum int,error){ return x+y,nil}// 第二个返回值没有命名// 正确写法func funcMui(x,y int)(sum int, err error){ return x+y,nil}
// new() 与 make() 的区别package mainimport( "fmt") func main(){ s1 := new([]int) s2 := make([]int, 0) fmt.Println(s1) fmt.Println(s2)}// 输入:
$ go run main.go &[][]
04
// 上面这段代码是否通过编译,不能的话起因是什么;如果能,输入什么。func main() { list := new([]int) list = append(list, 1) fmt.Println(list)}// 不能通过编译,new([]int) 之后的 list 是一个 *[]int 类型的指针,// 不能对指针执行 append 操作。// 能够改写为:func main() { list := new([]int) *list = append(*list, 1) fmt.Println(*list)}// 上面这段代码是否通过编译,如果能够,输入什么?func main() { s1 := []int{1, 2, 3} s2 := []int{4, 5} s1 = append(s1, s2) fmt.Println(s1)}// 不能通过编译。// append() 的第二个参数不能间接应用 slice,需应用 … 操作符,将一个切片追加到另一个切片上:append(s1,s2…)。或者间接跟上元素,形如:append(s1,1,2,3)。// 上面这段代码是否通过编译,如果能够,输入什么?var( size := 1024 max_size = size*2)func main() { fmt.Println(size,max_size)}// 不能通过编译。变量申明的简短模式,形如:x := 100。有限度:// 只能在函数外部应用简短模式
05
// 上面这段代码是否通过编译package mainimport( "fmt") func main() { sn1 := struct { age int name string }{age: 11, name: "qq"} sn2 := struct { age int name string }{age: 11, name: "qq"} if sn1 == sn2 { fmt.Println("sn1 == sn2") } sm1 := struct { age int m map[string]string }{age: 11, m: map[string]string{"a": "1"}} sm2 := struct { age int m map[string]string }{age: 11, m: map[string]string{"a": "1"}} if sm1 == sm2 { fmt.Println("sm1 == sm2") }}// 不能通过编译, 因为// invalid operation: sm1 == sm2 (struct containing map[string]string cannot be compared)// 什么是可比拟的呢,常见的有 bool、数值型、字符、指针、数组等,像切片、map、函数等是不能比拟的