zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    .NET使用DAO.NET实体类模型操作数据库
    .NET连接数据库及基本增删改查
    Struts2超链接
    微信小程序与Java后台的通信
    Java中重载和重写的区别
    Java中Double保留后小数位的几种方法
    北大集训2019游记
    HTML5前端
    软件测试面试题2018
    软件测试笔试题(2018精华篇)
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15847717.html
Copyright © 2011-2022 走看看