Common Knowledge

  • 什么是死锁? 线程 a 和线程 b 互相持有对方想要的资源, 双方都在等待对方释放资源, 僵持不下; 操作一个对象, 必须需要对象锁, 如果线程 a 拥有资源 A 的 🔓, 线程 b 拥有资源 B 的 🔓, 当同时, 线程 a 和线程 b 想要操作被对方占用了对象 🔓 的资源, 就必须等待对方, 到天长地久…

  • 什么是乐观锁? 什么是悲观 🔓? 乐观锁: 每次拿到数据之后不会上锁, 但是会在更新的时候根据版本号的区别, 判断以下别人有没有更新这个数据; 数据的更新都是有版本号标记的, 如果一个数据被两个线程更新, 线程 a 拿到的时候, 版本号是 1, 它对数据进行操作后, 版本号+1, 成为 2, 线程 b 拿到的时候, 版本号是 2, 它对数据进行操作后, 版本号+1, 还是 2, 那么线程 b 的操作就会被舍弃… 悲观锁: 每次拿到数据之后都会上锁(对共享资源上锁), 这样被人想要拿数据的时候就必须等待, 直到他用完资源, 把锁空出来;

  • Go 中的多态和继承?

    多态: 父类 Animal 和子类: Dog, 两者共同拥有一个方法, run(), 如果有一个函数可以接收这个 Animal, 那么就可以接收 Dog, 这时它运行传入对象的 run 方法, 可能调用 Animal 的 run 方法, 也可能调用 Dog 的 run 方法, 这个就叫做多态;

    Go 中多态的实现依赖 interface, 如果两个类都实现了 run 方法, 那么它们就实现了这个接口, 传入这个接口的函数就可以接收传入这两个类;

    继承: Go 中, 一个类要使用其他类的方法 组合

    Go 中的组合:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    type Person struct {
        Name string
        Age  int
    }
    func (p *Person) Laugh() {
        log.Println("Hahahahaha :)")
    }
    // 如果Person和Children都有Laugh(), 那么c.Laugh() 会优先使用Child的Laugh
    // 如果Children想要拿到Person的属性: Field, 那么就使用c.Person.Field
    type Children struct {
        *Person
        Height int
    }
    func main() {
        c := Children{&{Name: "leo2n", Age: 26}, 180}
        c.Langh()
    }