浅谈Go与习题(二十)

51 阅读2分钟

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

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

切片派生

观察下列代码,判断是否可以通过编译?

package main

import "fmt"

func main() {
     s1 := make([]int, 3, 9)
     fmt.Println(len(s1)) 
     s2 := s1[4:8]
     fmt.Println(len(s2)) 
}

参考答案:可以通过编译,这里会输出3 4,这里涉及到从一个基础切片中派生出的子切片,而子切片的长度可能会比基础切片的长度要大,就比如例子中的s1的基础切片长度为 baseSlice,对s1使用操作符 [low,high],遵循以下这个规则:0 <= low <= high <= cap(baseSlice),只要符合上述的规则,那么切片的操作都是可以大于len(baseSlice)

Method Value

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

type N int

func (n N) test(){
     fmt.Println(n)
 }

 func main()  {
    var n N = 100
    p := &n

    n++
    f1 := n.test //复制操作

    n++
    f2 := p.test //复制*p

    n++
    fmt.Println(n)

    f1()
    f2()
}

参考答案:输出103 101 102,这里涉及到方法值的知识点,基于实例或者指针引用的method value,参数签名不会改变,依旧按照原有的方式进行调用,当method value赋值给变量或者作为函数参数传递时,会立即计算并复制该方法执行所需的receiver对象,将其绑定,以便后续的操作,能隐式传入receiver参数,例如f1:=n.test由于方法的receiver是N类型,所以会直接复制变量n的值为101

值比较

观察下列代码,判断是否会发出panic异常?

package main

func main() {
  var x interface{}
  var y interface{} = []int{3, 5}
  _ = x == x
  _ = x == y
  _ = y == y
}

参考答案:_ = y == y 这句会报异常,错误信息为:panic: runtime error: comparing uncomparable type []int,因为接口的比较是比较动态类型和动态值否一值,并且动态类型为可比较类型,这里的切片[]int{3,5}是不可以比较类型,所以导致接口的比较也会发生错误,这里需要注意的是,map、切片和函数类型是不支持比较的,但是可以和预声明标识符nil进行比较

总结

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