浅谈Go与习题(三)

93 阅读3分钟

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

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

字符串连接

关于字符串连接,以下的语法哪一个是正确的?

  • A. str := ‘abc’ + ‘123’
  • B. str := “abc” + “123”
  • C. str := ‘123’ + “abc”
  • D. fmt.Sprintf(“abc%d”, 123)

参考答案:选B和D,两个字符串连接要使用统一的""符号,或者使用Sprintf格式化,也可以使用strings,Join(),buffer.WriteString()等

iota的使用

const (
     x = iota
     _
     y
     z = "zz"
     k 
     p = iota
 )

func main()  {
    fmt.Println(x,y,z,k,p)
}

上述代码是可以通过编译的,输出的结果是0 2 zz zz 5 ,这里考察itoa的使用方法,推荐你能做对这几道面试题吗?Go语言关于const和iota进阶实战 - 掘金 (juejin.cn) 原因就是iota初始的话从0开始编码,后续的数字会逐级加一,变量P的位置iota已经算到5了,这里再次使用iota的值就会直接从5开始计数

nil的赋值

下面选项中哪个赋值是正确的?

  • A. var x = nil
  • B. var x interface{} = nil
  • C. var x string = nil
  • D. var x error = nil

参考答案:选B和D,这里考察nil值的赋值问题,nil只能赋值给指针、chan、func、interface、map 或 slice 类型的变量,这里D选项的error也是一种内置接口类型,所以nil也是可以赋值的,看下面error的原码:

type error interface {
    Error() string
}

init函数

下面选项中关于init函数解释哪个是正确的?

  • A. 一个包中,可以包含多个 init 函数
  • B. 程序编译时,先执行依赖包的 init 函数,再执行 main 包内的 init 函数
  • C. main 包中,不能有 init 函数
  • D. init 函数可以被其他函数调用

参考答案:选A和B,这里对init的使用有6点建议:

  • init() 函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
  • 一个包可以创建多个 init() 函数,一个源文件也可以包含多个 init() 函数
  • 同一个包中多个 init() 函数的执行顺序没有明确定义,但是不同包的init函数是根据包导入的依赖关系,类似递归的形式
  • init() 函数在代码中不能被显示调用、不能被引用赋值给函数变量,否则出现编译错误
  • 一个包被引用多次,如 A import B,C import B,A import C,B 被引用多次,但 B 包只会初始化一次
  • 引入包,不能出现闭环导包,否则会出现编译不通过的情况,例如 A import B,B import A

函数赋值

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

func hello() []string {  
     return nil
 }

 func main() {  
     h := hello
     if h == nil {
         fmt.Println("nil")
     } else {
        fmt.Println("not nil")
    }
}

参考答案:这里会输出not nil,因为h := hello是讲函数赋值给变量h,不是函数的返回值,所以是输出not nil

总结

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