Golang面试题精选

Golang面试题精选 我整理了一份可以在面试中提问的 Go语言面试问题 列表。

2 回复

很好

更多关于Golang面试题精选的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是一些常见的Go语言面试问题及其解答示例,适合面试官或准备面试的开发者参考:

1. 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")         // 主线程执行
    }
    

2. 解释Go中的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
    

3. Go语言中如何实现并发安全?

  • 解答:使用sync.Mutexsync.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)
    }
    

4. 解释Go中的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")
    }
    

5. Go语言中的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)
    }
    

6. Go语言中newmake的区别?

  • 解答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)
    }
    

7. 解释Go中的垃圾回收机制

  • 解答:Go使用并发标记-清除(mark-and-sweep)垃圾回收器,自动管理内存,通过三色标记法减少暂停时间(STW)。

8. Go语言中如何高效拼接字符串?

  • 解答:使用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的并发、内存管理、接口等核心概念,适合评估候选人的实际编码能力和理论理解。

回到顶部