Go 语言是一门开发 Web 应用程序、网络服务器和分布式系统的高效语言。它是一种现代化的编程语言,同时也是一种编写高效程序的最佳选择。在 Go 语言中,有很多关键字和函数,其中一些关键字和函数是面试官最喜欢问的问题。在本文中,我们将探讨这些关键字和函数,并提供一些演示代码,以帮助您更好地理解这些问题。
一、关键字
- defer
defer 是一个非常有用的关键字,它用于在函数退出前执行某些操作。这些操作可以是关闭文件、释放资源、解锁锁等等。在 Go 语言中,defer 的执行顺序是“后进先出”,也就是说,最后一个 defer 语句将最先执行,而第一个 defer 语句将最后执行。让我们看一下下面的代码:
package main
import "fmt"
func main() {
defer fmt.Println("World")
fmt.Println("Hello")
}
当我们运行这个程序时,输出结果是:
Hello
World
可以看到,defer 语句将在函数退出之前执行,这是非常有用的。
- panic 和 recover
panic 和 recover 是一对非常有用的关键字,它们用于处理程序中的异常。当程序发生异常时,它将立即停止并抛出一个 panic 异常。如果我们没有对这个异常进行处理,程序将崩溃。但是,如果我们使用 recover 关键字,在 panic 抛出异常后捕获该异常,程序将可以继续执行。让我们看一下下面的代码:
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered")
}
}()
fmt.Println("Start")
panic("Problem")
}
当我们运行这个程序时,输出结果是:
Start
Recovered
可以看到,当 panic 发生时,我们使用了 defer 和 recover 关键字来处理异常,并继续执行程序。
- go
go 关键字是用于启动一个新的 goroutine 的。goroutine 是 Go 语言中的轻量级线程,它可以在一个程序中同时运行多个函数。使用 go 关键字,我们可以很容易地启动一个新的 goroutine 并运行一个函数。让我们看一下下面的代码:
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("World")
say("Hello")
}
当我们运行这个程序时,输出结果是:
Hello
World
Hello
World
Hello
World
Hello
World
Hello
可以看到,我们使用了 go 关键字来启动一个新的 goroutine 并运行一个函数。
二、函数
- make
make 函数用于创建一个类型为切片、映射或通道的对象,并为其分配内存和初始化其字段。让我们看一下下面的代码:
package main
import "fmt"
func main() {
a := make([]int, 5)
fmt.Println("a:", a)
b := make(map[string]int)
fmt.Println("b:", b)
c := make(chan int)
fmt.Println("c:", c)
}
当我们运行这个程序时,输出结果是:
a: [0 0 0 0 0]
b: map[]
c: 0xc000040060
可以看到,我们使用 make 函数创建了一个切片、一个映射和一个通道,并为其分配了内存和初始化了其字段。
- append
append 函数用于向一个切片添加新的元素。它接受一个或多个参数,并将它们添加到切片的末尾。如果切片的容量不足,append 函数将自动分配更多的内存来扩展切片。让我们看一下下面的代码:
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
fmt.Println("a:", a)
a = append(a, 4, 5, 6)
fmt.Println("a:", a)
}
当我们运行这个程序时,输出结果是:
a: [1 2 3]
a: [1 2 3 4 5 6]
可以看到,我们使用 append 函数向一个切片添加了新的元素。
- close
close 函数用于关闭一个通道。当我们向一个已经关闭的通道发送数据时,程序将会崩溃。让我们看一下下面的代码:
package main
import "fmt"
func main() {
c := make(chan int, 2)
c <- 1
c <- 2
close(c)
for i := range c {
fmt.Println(i)
}
}
当我们运行这个程序时,输出结果是:
1
2
可以看到,我们使用 close 函数关闭了一个通道,并在 for 循环中读取了通道中的数据。
总结
在本文中,我们探讨了面试官最喜欢问的 Go 关键字和函数问题。我们了解了 defer、panic、recover、go、make、append 和 close 这些关键字和函数,并提供了一些演示代码,以帮助您更好地理解这些问题。希望这篇文章对您有所帮助,谢谢阅读!