• Golang 中的静态类型和动态类型


    定义说明

    • 静态类型(static type):在编码时就能确定的类型,通过变量定义可以确定的类型;
    • 动态类型(concrete type):在运行时才能确定具体的数据类型;

    动态静态类型如何理解?

    go 语言中interface(any)可以承接所有类型的数据,所以这部分只有具体运行的时候,才能确定数据具体类型:

    	var i interface{}
    	var num int = 1
    	var str string = "hello world"
    	i = num
    	i= str
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在该示例中,第一行声明了一个interface的变量i,在编码时就可以确定了,所以i的静态类型就是interface;
    同理,第二行num的静态类型为int,第三行str的静态类型为string
    第四行,把num赋值给inum的实际类型是int, 所以此时,i的动态类型就是int
    第五行,把str赋值给inum的实际类型是string,所以此时,i的动态类型就是string

    Golang 中的interface的底层延申

    golang 中interface有两种含义/用法:

    1. 常规的接口类型,有一些带实现的接口定义
    2. 表示任意数据类型any

    golang 的底层实现也是根据这两种情况做了不同的实现,底层分别对应ifaceeface

    // 空接口结构
    type eface struct {
        _type *_type			// 实体类型
        data  unsafe.Pointer	// 数据地址
    }
    
    // 包含方法的结构
    type iface struct {
        tab  *itab			// 接口和实体类型
        data unsafe.Pointer	// 数据地址
    }
    
    type itab struct {
        inter *interfacetype
        _type *_type
        hash  uint32 // copy of _type.hash. Used for type switches.
        _     [4]byte
        fun   [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.
    }
    
    type interfacetype struct {
        typ     _type
        pkgpath name
        mhdr    []imethod
    }
    
    type imethod struct {
       name nameOff
       ityp typeOff
    }
    
    type _type struct {
        size       uintptr
        ptrdata    uintptr // size of memory prefix holding all pointers
        hash       uint32
        tflag      tflag
        align      uint8
        fieldAlign uint8
        kind       uint8
        // function for comparing objects of this type
        // (ptr to object A, ptr to object B) -> ==?
        equal func(unsafe.Pointer, unsafe.Pointer) bool
        // gcdata stores the GC type data for the garbage collector.
        // If the KindGCProg bit is set in kind, gcdata is a GC program.
        // Otherwise it is a ptrmask bitmap. See mbitmap.go for details.
        gcdata    *byte
        str       nameOff
        ptrToThis typeOff
    }
    
    type nameOff int32
    type typeOff int32
    type tflag uint8
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
  • 相关阅读:
    测量学:绪论那些重点基础知识大总结
    2023年9月 青少年软件编程等级考试Scratch二级真题
    大学生能参加哪些比赛你都知道吗? (适合各个专业)了解 还是 错过 ?
    假结婚取得北京户口,效力如何认定
    理解React页面渲染原理,如何优化React性能?
    windos 下 nginx 安装
    论文阅读 (69):Collaborative Learning for Deep Neural Networks
    MySql主从复制(博主已踩过所有坑...)
    IO类型游戏研发定制开发
    Nginx__高级进阶篇
  • 原文地址:https://blog.csdn.net/YPLee_8/article/details/132691915