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

  • 相关阅读:
    java源码之HashMap和HashTable的异同
    java源码之HashMap
    进制转换
    java基本数据类型及其包装类
    java实例化对象的五种方法
    20 栈的压入、弹出序列
    19 包含min函数的栈
    18 顺时针打印矩阵(记忆,常忘记)
    16 树的子结构(这题多复习)
    15合并两个排序的链表
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15847717.html
Copyright © 2011-2022 走看看