Go - 面试题收集(持续charge...)

01

一个函数内defer的执行顺序与其声明顺序相反
出现panic语句时,会先执行defer后执行panic
出现panic语句时,声明在panic后面的任何代码不再执行
package main

import(
    "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 main

import(
    "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 -> 3
1 -> 3
2 -> 3
3 -> 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 main

import(
    "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 main

import(
    "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、函数等是不能比较的

你可能感兴趣的:(go面试问题)