开启掘金成长之旅!这是我参与「掘金日新计划 · 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(),所以不能通过编译
总结
今天浅谈了Go的习题(六),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!