注册

Golang精编49面试题汇总(选择题)

让我来详细讲解一下“Golang精编49面试题汇总(选择题)”的完整攻略。

首先,这份面试题汇总是由一位知名的Go语言程序员整理的,其中包含了49道选择题,题目涵盖了常识性问题、基础问题、进阶问题等多个方面,是一份较为全面的Go语言面试复习资料。

接下来,我会分别对其中两道示例题进行详细说明。

第一道示例题

func main() {
    m := map[int]int{1: 1, 2: 2, 3: 3}
    for k, v := range m {
        go func() {
            fmt.Println(k, v)
        }()
    }
    time.Sleep(time.Second)
}

此题考察的是对于Go语言循环变量作用域的理解。这段代码的输出结果为什么呢?

答案是:

3 3
3 3
3 3

这是因为循环变量kv被共享到了每一个Go程中,当主Go程中的循环结束时,kv都变成了3。所以,无论执行多少次Go程,输出结果都是相同的。

第二道示例题

type Value struct {
    mu sync.Mutex
    value int
}

var (
    m = make(map[string]*Value)
)

func readValue(key string) int {
    m[key].mu.Lock()
    defer m[key].mu.Unlock()
    return m[key].value
}

func main() {
    key := "test"
    m[key] = &Value{}
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            readValue(key)
        }()
    }
    wg.Wait()
}

此题考察的是对于Go语言并发安全的理解。这段代码的输出结果会是什么呢?

答案是:

这段代码的输出结果是正常的,因为我们采用了sync.Mutex来进行锁定操作,保证了对共享变量的安全访问。

以上就是针对两道示例题的说明,此外该面试题还涉及到一些其他方面(如Go语言内存模型、垃圾回收机制、性能优化等),需要我们在学习中不断练习和掌握。