golang泛型引子

  1. 举个例子,有如下代码:

    package main
    
    import "sync"
    
    // generics first example
    type Lockable [T any] struct {
      mut sync.Mutex
      Data T
    }
    
    func main(){
    
      var n Lockable[int]
      n.mut.Lock()
      n.Data++
      n.mut.Unlock()
    
      var f Lockable[float32]
      f.mut.Lock()
      f.Data+=1.23
      f.mut.Unlock()
    
      var b Lockable[[]byte]
      b.mut.Lock()
      b.Data = []byte("12312")
      b.mut.Unlock()
    }
    
  2. 在该例子中我们为 Lockable 定义了一个泛型(或者说是形参类型的定义?)为 T,并且规定 T 能够接收 any(空接口),这就使得对应了在之后代码中我们能够根据需要分别创建了数据类型是 int32 类型,[]byte 的 Lockable。

  3. 但是如果没有泛型我们该怎么写呢?我们不得不这样写

    type Int32Lockable struct {
        sync.Mutex
        Data int32
    }
    
    type BytesLockable struct {
        sync.Mutex
        Data []byte
    }
    

    试想一下,如果我们不止需要对这两类类型声明 Lockable,还要对 bool,float32,string 等等都要创建相对应的 Lockable 呢?代码就会变得十分丑陋而且重复度高,十分不适合正常开发

  4. 所以泛型应运而生,我们可以通过泛型来规定形参变量的可接受的类型从而降低代码的重复性

posted @ 2023-09-06 20:52  一只gopher  阅读(23)  评论(0)    收藏  举报