Go 语言笔试面试题

2021/12/15 go面试

日常收集的题

# 一. 基础语法

# 1 =:= 的区别?

答案

:= 声明+赋值

= 仅赋值

var a int
a = 10
// 等价于
a := 10
1
2
3
4

# 2 Go 有异常类型吗?

答案

Go 没有异常类型,只有错误类型(Error),通常使用返回值来表示异常状态。

f, err := os.Open("/tmp/a.txt")
if err != nil {
    log.Fatal(err)
}
1
2
3
4

# 二. 代码输出

# 常量与变量

  1. 下面代码输出
func main() {
	const (
		a, b = "golang", 100
		d, e
		f bool = true
		g
	)
	fmt.Println(d, e, g)
}
1
2
3
4
5
6
7
8
9
答案

golang 100 true

在同一个 const group 中,如果常量定义与前一行的定义一致,则可以省略类型和值。编译时,会按照前一行的定义自动补全。即等价于

func main() {
	const (
		a, b = "golang", 100
		d, e = "golang", 100
		f bool = true
		g bool = true
	)
	fmt.Println(d, e, g)
}
1
2
3
4
5
6
7
8
9
  1. 下面代码输出
func main() {
	const N = 100
	var x int = N

	const M int32 = 100
	var y int = M
	fmt.Println(x, y)
}
1
2
3
4
5
6
7
8
答案

编译失败:cannot use M (type int32) as type int in assignment

Go 语言中,常量分为无类型常量和有类型常量两种,const N = 100,属于无类型常量,赋值给其他变量时,如果字面量能够转换为对应类型的变量,则赋值成功,例如,var x int = N。但是对于有类型的常量 const M int32 = 100,赋值给其他变量时,需要类型匹配才能成功,所以显示地类型转换

var y int = int(M)
1
  1. 下面代码输出
func main() {
	var a int8 = -1
	var b int8 = -128 / a
	fmt.Println(b)
}
1
2
3
4
5
答案

-128

nt8 能表示的数字的范围是 [-2^7, 2^7-1],即 [-128, 127]。-128 是无类型常量,转换为 int8,再除以变量 -1,结果为 128,常量除以变量,结果是一个变量。变量转换时允许溢出,符号位变为1,转为补码后恰好等于 -128。

对于有符号整型,最高位是是符号位,计算机用补码表示负数。补码 = 原码取反加一。

例如:

-1 :  11111111
00000001(原码)    11111110(取反)    11111111(加一)
-128:    
10000000(原码)    01111111(取反)    10000000(加一)

-1 + 1 = 0
11111111 + 00000001 = 00000000(最高位溢出省略)
-128 + 127 = -1
10000000 + 01111111 = 11111111
1
2
3
4
5
6
7
8
9
  1. 下面代码输出
func main() {
	const a int8 = -1
	var b int8 = -128 / a
	fmt.Println(b)
}
1
2
3
4
5
答案

编译失败:constant 128 overflows int8

-128 和 a 都是常量,在编译时求值,-128 / a = 128,两个常量相除,结果也是一个常量,常量类型转换时不允许溢出,因而编译失败。

# 切片

  1. 下面代码输出
package main

import "fmt"

func main() {
	a := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	b := a[2:5]
	c := a[9:10]
	b = append(b, 1)
	c = append(c, 1)
	fmt.Println(a)
}
1
2
3
4
5
6
7
8
9
10
11
12
答案

[0 1 2 3 4 1 6 7 8 9]

最后更新时间: 2025/2/27 19:03:05