开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
今天来学习下Go常见的习题问题(四),也是面试中可能会遇到的,让我们来一起学习吧~
类型断言
观察下列代码,是否能通过编译?如果可以,输出是什么?
func GetValue() int {
return 1
}
func main() {
i := GetValue()
switch i.(type) {
case int:
println("int")
case string:
println("string")
case interface{}:
println("interface")
default:
println("unknown")
}
}
参考答案:上述代码不能通过编译,因为i.(type)类型选择的语法形式中,i只能是接口类型,type是固定关键字,只有接口才能使用类型选择,修改代码如下:
func GetValue() interface{} {
return 12
}
func main() {
i := GetValue()
switch i.(type) {
case int:
println("int")
case string:
println("string")
case interface{}:
println("interface")
default:
println("unknown")
}
}
channel的使用
下列选项中,关于channel的操作正确的是()
- A. var ch chan int
- B. ch := make(chan int)
- C. <- ch
- D. ch <-
参考答案:选择ABC, 前两项都是关于channel的声明,第三个是读取channel,第四个往channel里面写数据,必须要有数据才行,所以第四个选项错误,需要改成ch <- "value"
map的零值
观察下列代码,输出结果是什么?
type person struct {
name string
}
func main() {
var m map[person]int
p := person{"YYQQ"}
fmt.Println(m[p])
}
参考答案: 输出结果为0,因为map中输出一个不存在值,会返回元素的零值,上述代码中m的类型为map[string]int,因为p不存在,所以输出int类型的零值,即0
不同类型相加
观察下列代码,能否通过编译?如果可以,输出的结果是什么?
func main() {
a := 12
b := 3.4
fmt.Println(a + b)
}
参考答案:不能通过编译,因为a的类型是int,b的类型是float,两个不同类型的值是不能相加
切片截取
观察下列代码,输出的结果是什么?
package main
import (
"fmt"
)
func main() {
a := [5]int{1, 2, 3, 4, 5}
t := a[3:4:4]
fmt.Println(t[0])
}
参考答案:输出结果为4
操作符 [i:j] ,在原来切片的基础上创建新的切片,从索引 i,到索引 j 结束,截取已有数组(切片)的任意部分,新切片的值包含原数组(切片)的 i 索引的值,但是不包含 j 索引的值。
i 如果省略,默认是 0,j 如果省略,默认是原数组(切片)的长度,i、j 都不能超过这个长度值,例如a[:2],a[1:]
假如底层数组的大小为 k,截取之后获得的切片的长度和容量的计算方法:长度:j-i,容量:k-i
重点: 截取操作符还可以有第三个参数,形如 [i:j:k],第三个参数 k 用来限制新切片的容量,但不能超过原数组(切片)的底层数组大小,截取获得的切片的长度和容量分别是:j-i、k-i。
上述代码中,截取后的新切片为[4],长度和容量都是1。
数组的比较
观察下列代码,输出的结果是什么?
func main(){
a := [2]int{5, 6}
b := [3]int{5, 6}
if a == b {
fmt.Println("equal")
} else {
fmt.Println("not equal")
}
}
参考答案:上述代码不能通过编译,因为go中的数组是值类型可以比较,并且数组的长度、类型也是数组类型的组成部分,因为数组a和b的长度不一致,不是相同的类型,所以不能通过编译
总结
今天浅谈了Go的习题(四),主要介绍了GO面试中会出现的问题,接下来会继续分享其他的习题的相关知识,对于一个刚入门的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!