Go 语言笔试面试题
日常收集的题
一. 基础语法
1 =
和 :=
的区别?
答案
:=
声明 赋值
=
仅赋值
1var a int
2a = 10
3// 等价于
4a := 10
2 Go 有异常类型吗?
答案
Go 没有异常类型,只有错误类型(Error),通常使用返回值来表示异常状态。
代码语言:javascript复制1f, err := os.Open("/tmp/a.txt")
2if err != nil {
3 log.Fatal(err)
4}
二. 代码输出
常量与变量
- 下面代码输出
1func main() {
2 const (
3 a, b = "golang", 100
4 d, e
5 f bool = true
6 g
7 )
8 fmt.Println(d, e, g)
9}
答案
golang 100 true
在同一个 const group 中,如果常量定义与前一行的定义一致,则可以省略类型和值。编译时,会按照前一行的定义自动补全。即等价于
代码语言:javascript复制1func main() {
2 const (
3 a, b = "golang", 100
4 d, e = "golang", 100
5 f bool = true
6 g bool = true
7 )
8 fmt.Println(d, e, g)
9}
- 下面代码输出
1func main() {
2 const N = 100
3 var x int = N
4
5 const M int32 = 100
6 var y int = M
7 fmt.Println(x, y)
8}
答案
编译失败:cannot use M (type int32) as type int in assignment
Go 语言中,常量分为无类型常量和有类型常量两种,const N = 100,属于无类型常量,赋值给其他变量时,如果字面量能够转换为对应类型的变量,则赋值成功,例如,var x int = N。但是对于有类型的常量 const M int32 = 100
,赋值给其他变量时,需要类型匹配才能成功,所以显示地类型转换
1var y int = int(M)
- 下面代码输出
1func main() {
2 var a int8 = -1
3 var b int8 = -128 / a
4 fmt.Println(b)
5}
答案
-128
nt8 能表示的数字的范围是 [-2^7, 2^7-1],即 [-128, 127]。-128 是无类型常量,转换为 int8,再除以变量 -1,结果为 128,常量除以变量,结果是一个变量。变量转换时允许溢出,符号位变为1,转为补码后恰好等于 -128。
对于有符号整型,最高位是是符号位,计算机用补码表示负数。补码 = 原码取反加一。
例如:
代码语言:javascript复制1-1 : 11111111
200000001(原码) 11111110(取反) 11111111(加一)
3-128:
410000000(原码) 01111111(取反) 10000000(加一)
5
6-1 1 = 0
711111111 00000001 = 00000000(最高位溢出省略)
8-128 127 = -1
910000000 01111111 = 11111111
- 下面代码输出
1func main() {
2 const a int8 = -1
3 var b int8 = -128 / a
4 fmt.Println(b)
5}
答案
编译失败:constant 128 overflows int8
-128 和 a 都是常量,在编译时求值,-128 / a = 128,两个常量相除,结果也是一个常量,常量类型转换时不允许溢出,因而编译失败。
切片
- 下面代码输出
1package main
2
3import "fmt"
4
5func main() {
6 a := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
7 b := a[2:5]
8 c := a[9:10]
9 b = append(b, 1)
10 c = append(c, 1)
11 fmt.Println(a)
12}
答案
[0 1 2 3 4 1 6 7 8 9]