go基础面试

01. =:= 的区别

在 Go 语言中,=:= 用于变量赋值,但它们的作用有所不同:

  • = 是赋值操作符,用于已经声明过的变量。例如:
    var a int
    a = 10
    
  • := 是短变量声明操作符,用于在函数内部声明并初始化变量。例如:
    a := 10
    

02. 指针的作用

指针是一种保存变量内存地址的变量。通过指针,可以间接修改或访问变量的值。指针的作用包括:

  1. 节省内存,避免不必要的值拷贝。
  2. 允许函数修改参数的值。
  3. 提升程序性能。

03. Go 允许多个返回值吗?

是的,Go 语言允许函数返回多个值。这是 Go 语言的一个显著特性。例如:

func swap(a, b int) (int, int) {
    return b, a
}

04. Go 有异常类型吗?

Go 语言没有传统的异常处理机制,如 try-catch。它使用返回值来表示错误,同时提供了 panicrecover 用于处理不可恢复的严重错误。
也可以用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 没有内置的枚举类型,但可以通过常量 constiota 关键字来模拟枚举值。例如:

type Day int

const (
    Sunday Day = iota
    Monday
    Tuesday
    // ...
)

16. 空 struct{} 的用途

struct{} 是 Go 语言中占用内存为 0 的数据类型,常用于信号传递或节省内存。例如:

  • 用于定义 channel,只传递信号而不传递数据。
  • 用作 map 的值类型,表示一个集合。
posted @ 2024-09-12 14:00  daligh  阅读(17)  评论(0)    收藏  举报