浅谈Go与习题(六)

105 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情

今天来学习下Go常见的习题问题(六),也是面试中可能会遇到的,让我们来一起学习吧~

字符串操作

观察下列代码,输出结果是什么?

func main() {
    str := "YYQQ"
    str[0] = 'x'
    fmt.Println(str)
}
  • A. YYQQ
  • B. xYQQ
  • C. compilation error 参考答案:选择C,这里考察go语言中的字符串常量是只读类型,不能进行修改,所以会出现编译错误

指针操作

观察下列代码,输出结果是什么?

func incr(p *int) int {
    *p++
    return *p
}

func main() {
    p := 2
    incr(&p)
    fmt.Println(p)
}

参考答案:输出结果是3,这里incr函数中的变量p是*int类型的指针,指向的是main函数中变量p的地址,通过*P++将该地址的值进行一个自增操作,最后变量p就变为3

可变函数

观察下列代码,调用该方法正确的是?

func add(args ...int) int {
    sum := 0
    for _, arg := range args {
        sum += arg
    }
    return sum
}
  • A. add(1, 2)
  • B. add(1, 2, 3)
  • C. add([]int{1, 2})
  • D. add([]int{1, 2, 3}…)

参考答案:选择ABD,add函数参数是...Type类型,表示该参数数量是可变的,可变函数的原理是把可变参数转换成一个切片类型,然后再传给函数,如果要将切片传入给可变函数,需要在变量后面加上...这样就会直接以切片形式传入。

注意:可变函数的参数,应该在最后一个(最右边)

空切片与nil切片

观察下列代码,划横线处填入哪个符合nil的选项?

func main() {
    var s1 []int
    var s2 = []int{}
    if __ == nil {
        fmt.Println("yes nil")
    }else{
        fmt.Println("no nil")
    }
}
  • A. s1
  • B. s2
  • C. s1、s2 都可以

参考答案:选择A,var s1 []int定义了一个nil切片,var s2 = []int{}定义了一个空切片,nil切片和nil是相等的,表示一个不存在的切片,空切片表示一个空的集合

map的使用

下列代码中标记的地方,如何修改才能通过编译?

func main() {
    var m map[string]int        //A
    m["yyqq"] = 123
    if v := m["qqyy"]; v != nil {  //B
        fmt.Println(v)
    }
}

参考答案:A处代码原先只是声明了map,没有分配内存空间,所以不能直接进行赋值,需要使用make()方法make(map[string]int)进行初始化,B处代码通过v,k:= m["qqyy"]的形式,当key值不存在的时候,v会返回int类型对应的零值,k会返回false进行后续的操作

func main() {
    m := make(map[string]int)        //A
    m["yyqq"] = 123
    if v,k := m["qqyy"]; k {        //B
        fmt.Println(v)
    }
}

接口的静态类型

观察下列代码,是否可以通过编译?如果可以,那么输出结果是什么?

type A interface {
    ShowA() int
}

type B interface {
    ShowB() int
}

type Work struct {
    i int
}

func (w Work) ShowA() int {
    return w.i + 1
}

func (w Work) ShowB() int {
    return w.i + 2
}

func main() {
    c := Work{3}
    var a A = c
    var b B = c
    fmt.Println(a.ShowB())
    fmt.Println(b.ShowA())
}

参考答案:编译不通过,因为变量a和b具有相同的变量类型和动态值Work{3},但是a的静态类型是A,b的静态类型是B,接口A的方法中不包括ShowB(),接口B的方法中不包括ShowA(),所以不能通过编译

image.png

总结

今天浅谈了Go的习题(六),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!