Go 语言笔试面试题

2023-06-10 17:45:29 浏览数 (1)

Go 语言笔试面试题

日常收集的题

一. 基础语法

1 =:= 的区别?

答案

:= 声明 赋值

= 仅赋值

代码语言:javascript复制
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}

二. 代码输出

常量与变量

  1. 下面代码输出
代码语言:javascript复制
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}
  1. 下面代码输出
代码语言:javascript复制
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,赋值给其他变量时,需要类型匹配才能成功,所以显示地类型转换

代码语言:javascript复制
1var y int = int(M)
  1. 下面代码输出
代码语言:javascript复制
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
  1. 下面代码输出
代码语言:javascript复制
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,两个常量相除,结果也是一个常量,常量类型转换时不允许溢出,因而编译失败。

切片

  1. 下面代码输出
代码语言:javascript复制
 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]

0 人点赞