让我来详细讲解一下“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
这是因为循环变量k
和v
被共享到了每一个Go程中,当主Go程中的循环结束时,k
和v
都变成了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语言内存模型、垃圾回收机制、性能优化等),需要我们在学习中不断练习和掌握。
本文链接:http://task.lmcjl.com/news/18781.html