go基础面试
01. = 和 := 的区别
在 Go 语言中,= 和 := 用于变量赋值,但它们的作用有所不同:
=是赋值操作符,用于已经声明过的变量。例如:var a int a = 10:=是短变量声明操作符,用于在函数内部声明并初始化变量。例如:a := 10
02. 指针的作用
指针是一种保存变量内存地址的变量。通过指针,可以间接修改或访问变量的值。指针的作用包括:
- 节省内存,避免不必要的值拷贝。
- 允许函数修改参数的值。
- 提升程序性能。
03. Go 允许多个返回值吗?
是的,Go 语言允许函数返回多个值。这是 Go 语言的一个显著特性。例如:
func swap(a, b int) (int, int) {
return b, a
}
04. Go 有异常类型吗?
Go 语言没有传统的异常处理机制,如 try-catch。它使用返回值来表示错误,同时提供了 panic 和 recover 用于处理不可恢复的严重错误。
也可以用errors.New()来定义自己的异常。errors.Error()会返回异常的字符串表示。只要实现error接口就可以定义自己的异常,
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
// 多一个函数当作构造函数
func New(text string) error {
return &errorString{text}
}
05. 什么是协程(Goroutine)
协程是 Go 中的轻量级线程,通过 go 关键字启动。它们具有独立的执行流,但和线程相比,创建和调度更加高效。协程通过 Go 的调度器进行管理。
06. 如何高效地拼接字符串
在 Go 中,高效拼接字符串可以使用 strings.Builder,而不是使用 + 操作符。strings.Builder 能减少内存分配次数,从而提升性能。例如:
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World!")
result := builder.String()
07. 什么是 rune 类型
rune 是 Go 中的 Unicode 代码点类型,实际上是 int32 的别名。它用于表示单个字符的 Unicode 码值,适用于多字节字符的处理。
08. 如何判断 map 中是否包含某个 key ?
可以使用 value, exists := map[key] 的形式判断 map 中是否包含某个 key。exists 是一个布尔值,表示 key 是否存在。例如:
m := map[string]int{"a": 1, "b": 2}
_, exists := m["a"]
09. Go 支持默认参数或可选参数吗?
Go 不支持默认参数或可选参数,但可以通过变参(variadic parameters)来实现类似的效果。例如:
func add(nums ...int) int {
sum := 0
for _, num := range nums {
sum += num
}
return sum
}
10. defer 的执行顺序
defer 语句会在函数返回之前执行,多个 defer 语句按栈的方式后进先出(LIFO)执行。例如:
defer fmt.Println("world")
defer fmt.Println("hello")
输出顺序为:
hello
world
11. 如何交换 2 个变量的值?
可以直接使用多重赋值的方式交换两个变量的值,而不需要中间变量:
a, b = b, a
12. Go 语言 tag 的用处?
Go 的 struct 标签(tags)用于为结构体字段添加元数据,常用于序列化(如 JSON、XML)。例如:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
在序列化时,字段 Name 会被映射为 name。
13. 如何判断 2 个字符串切片(slice)是否相等?
可以使用标准库中的 reflect.DeepEqual 函数来判断两个 slice 是否相等:
if reflect.DeepEqual(slice1, slice2) {
fmt.Println("Equal")
}
14. 字符串打印时,%v 和 %+v 的区别
%v:按默认格式打印值。%+v:除了打印值,还会打印结构体字段的名称。
例如:
type Person struct {
Name string
Age int
}
p := Person{"Alice", 30}
fmt.Printf("%v\n", p) // {Alice 30}
fmt.Printf("%+v\n", p) // {Name:Alice Age:30}
15. Go 语言中如何表示枚举值(enums)?
Go 没有内置的枚举类型,但可以通过常量 const 和 iota 关键字来模拟枚举值。例如:
type Day int
const (
Sunday Day = iota
Monday
Tuesday
// ...
)
16. 空 struct{} 的用途
空 struct{} 是 Go 语言中占用内存为 0 的数据类型,常用于信号传递或节省内存。例如:
- 用于定义 channel,只传递信号而不传递数据。
- 用作 map 的值类型,表示一个集合。

浙公网安备 33010602011771号