• go面试题:第一天


    506991b636788df74c8725812d75de13.png

    1. 下面代码输出什么?

    func main() {
        m := map[string]int{
            "G": 7, "A": 1,
            "C": 3, "E": 5,
            "D": 4, "B": 2,
            "F": 6, "I": 9,
            "H": 8,
        }
        var order []string
        for k, _ := range m {
            order = append(order, k)
        }
        fmt.Println(order)
    }

    参考答案即解析:按字母无序输出。知识点:遍历 map 是无序的。

    2.下面的代码有什么问题?

    type UserAges struct {
        ages map[string]int
        sync.Mutex
    }
    
    func (ua *UserAges) Add(name string, age int) {
        ua.Lock()
        defer ua.Unlock()
        ua.ages[name] = age
    }
    
    func (ua *UserAges) Get(name string) int {
        if age, ok := ua.ages[name]; ok {
            return age
        }
        return -1
    }
    
    func main() {
        count := 1000
        gw := sync.WaitGroup{}
        gw.Add(count * 3)
        u := UserAges{ages: map[string]int{}}
        add := func(i int) {
            u.Add(fmt.Sprintf("user_%d", i), i)
            gw.Done()
        }
        for i := 0; i < count; i++ {
            go add(i)
            go add(i)
        }
        for i := 0; i < count; i++ {
            go func(i int) {
                defer gw.Done()
                u.Get(fmt.Sprintf("user_%d", i))
            }(i)
        }
        gw.Wait()
        fmt.Println("Done")
    }

    参考答案即解析:在执行 Get() 方法时可能报错。知识点:读写锁。虽然可以使用 sync.Mutex 做写锁,但是 map 是并发读写不安全的。map 属于引用类型,并发读写时多个协程是通过指针访问同一个地址,即访问共享变量,此时同时读写资源存在竞争关系,会报错 “fatal error: concurrent map read and map write”。

    你的点赞关注是对我最大的支持,求一键三连:分享朋友圈、点赞、在看

    公众号后台回复666,可以获得免费电子书籍

    3cc6cca506865bda86f446f028e94cc2.png

  • 相关阅读:
    zendstuido10 配置spket插件
    Extjs各版本的下载链接
    主题:Android、iPhone和Java三个平台一致的加密工具
    TestDisk 恢复rm -rf 的文件
    java实现定时任务的三种方法
    mac 下安装 lua5.3 + cjson
    Mac OS X 上Lua的安装方法
    Channel States
    JSON常见操作
    微信小程序——获取元素的宽高等属性
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15847717.html
Copyright © 2020-2023  润新知