以下是一些常见的Go语言面试问题及其解答示例,适合面试官或准备面试的开发者参考:
goroutine和线程有什么区别?goroutine是Go的轻量级线程,由Go运行时管理,开销远小于操作系统线程。一个Go程序可以轻松创建成千上万的goroutine,而线程数量受系统资源限制。package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("goroutine") // 启动goroutine
say("main") // 主线程执行
}
defer关键字及其执行顺序defer用于延迟执行函数调用,通常用于资源清理(如关闭文件)。多个defer语句按后进先出(LIFO)顺序执行。package main
import "fmt"
func main() {
defer fmt.Println("First defer")
defer fmt.Println("Second defer")
fmt.Println("Main execution")
}
// 输出:
// Main execution
// Second defer
// First defer
sync.Mutex或sync.RWMutex保护共享资源,或通过channel进行通信。package main
import (
"fmt"
"sync"
)
var counter int
var mu sync.Mutex
func increment() {
mu.Lock()
counter++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait()
fmt.Println("Counter:", counter)
}
interface和空接口interface{}interface定义了一组方法签名,类型实现这些方法即实现了该接口。空接口interface{}没有方法,可以存储任何类型的值。package main
import "fmt"
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func printValue(v interface{}) {
fmt.Println("Value:", v)
}
func main() {
var s Shape = Circle{Radius: 5}
fmt.Println("Area:", s.Area())
printValue(42)
printValue("hello")
}
channel是什么?如何避免死锁?channel是用于goroutine间通信的管道。死锁常因无缓冲channel阻塞导致,需确保发送和接收配对,或使用带缓冲的channel。channel):package main
import "fmt"
func main() {
ch := make(chan int, 2) // 缓冲大小为2
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
}
new和make的区别?new(T)返回指向类型T零值的指针(*T),仅分配内存。make(T, args)用于初始化切片、映射或通道,返回类型T(非指针)。package main
import "fmt"
func main() {
p := new(int) // p为*int,指向0
fmt.Println(*p)
s := make([]int, 3) // s为[]int,长度3
fmt.Println(s)
}
strings.Builder避免多次分配内存。package main
import (
"strings"
"fmt"
)
func main() {
var builder strings.Builder
for i := 0; i < 10; i++ {
builder.WriteString("a")
}
result := builder.String()
fmt.Println(result)
}
这些问题覆盖了Go的并发、内存管理、接口等核心概念,适合评估候选人的实际编码能力和理论理解。
