面试题答案
一键面试-
实现思路:
atomic.Value
本身只能存储和加载interface{}
类型的值。所以首先要将自定义的复杂结构体类型转换为interface{}
类型才能存储到atomic.Value
中。- 读取时,从
atomic.Value
中加载出interface{}
类型的值,再将其转换回自定义的复杂结构体类型。 - 更新时,先创建一个新的自定义复杂结构体实例,将其转换为
interface{}
类型,然后使用atomic.Value
的Store
方法安全地更新值。
-
关键代码片段:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
// 自定义复杂结构体
type ComplexStruct struct {
Field1 int
Field2 string
NestedStruct struct {
SubField1 float64
}
Field3 []int
}
func main() {
var value atomic.Value
// 初始化
initial := ComplexStruct{
Field1: 1,
Field2: "initial",
NestedStruct: struct {
SubField1 float64
}{SubField1: 1.0},
Field3: []int{1, 2, 3},
}
value.Store(initial)
var wg sync.WaitGroup
wg.Add(2)
// 模拟并发写
go func() {
defer wg.Done()
newStruct := ComplexStruct{
Field1: 2,
Field2: "new",
NestedStruct: struct {
SubField1 float64
}{SubField1: 2.0},
Field3: []int{4, 5, 6},
}
value.Store(newStruct)
}()
// 模拟并发读
go func() {
defer wg.Done()
loaded := value.Load().(ComplexStruct)
fmt.Println(loaded)
}()
wg.Wait()
}
在上述代码中:
- 定义了
ComplexStruct
这个自定义复杂结构体。 - 使用
atomic.Value
存储和加载ComplexStruct
实例。 - 通过两个 goroutine 模拟并发的读写操作,展示了如何在并发环境下安全地使用
atomic.Value
对复杂结构体进行更新和读取。