Go有异常类型吗

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

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

什么是协程Goroutine

Goroutine 是与其他函数或方法同时运行的函数或方法。 Goroutines 可以被认为是轻量级的线程。 与线程相比,创建 Goroutine 的开销很小。 Go应用程序同时运行数千个 Goroutine 是非常常见的做法。

如何高效地拼接字符串

在Go中,字符串是只读的,也就意味着每次修改操作都会创建一个新的字符串。如果需要拼接多次,应该使用string.Builder,最小化内存拷贝次数。

1
2
3
4
5
var str strings.Builder
for i := 0; i < 1000; i++ {
str.WriteString("a")
}
fmt.Println(str.String())

什么是rune类型

ASCII 码只需要 7 bit 就可以完整地表示,但只能表示英文字母在内的128个字符,为了表示世界上大部分的文字系统,发明了 Unicode, 它是ASCII的超集,包含世界上书写系统中存在的所有字符,并为每个代码分配一个标准编号(称为Unicode CodePoint),在 Go 语言中称之为 rune,是 int32 类型的别名。

如何判断map中是否包含某个key

1
2
3
if val, ok := dict["foo"]; ok {
//do something here
}

dict[“foo”] 有 2 个返回值,val 和 ok,如果 ok 等于 true,则说明 dict 包含 key “foo”,val 将被赋予 “foo” 对应的值。

defer的执行顺序

  • 多个defer语句,遵从后进先出(Last in First Out, LIFO)的原则,最后声明的defer语句,最先得到执行。
  • defer在return语句执行后执行,但在函数退出之前,defer可以修改返回值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func test() int {
i := 0
defer func() {
fmt.Println("defer1")
}()
defer func() {
i += 1
fmt.Println("defer2")
}()
return i
}

func main() {
fmt.Println("return", test())
}
// defer2
// defer1
// return 0

如何交换两个变量的值

1
2
3
a, b := "A", "B"
a, b = b, a
fmt.Println(a, b) // B A