开启掘金成长之旅!这是我参与「掘金日新计划 · 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面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!