Golang中的静态类型和动态类型使用及说明

 更新时间:2026年06月23日 09:47:20   作者:YPLee_8  
这段描述主要解释了静态类型和动态类型的概念,并通过Golang中的interface变量举例说明了这两种类型的区别,文章详细解析了在不同赋值操作下,变量的静态类型和动态类型的变化过程,强调了interface在Golang中的特殊作用

定义说明

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

动态静态类型如何理解?

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

	var i interface{}
	var num int = 1
	var str string = "hello world"
	i = num
	i= str

在该示例中,第一行声明了一个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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决老版本goland无法调试新版本go的问题

    解决老版本goland无法调试新版本go的问题

    这篇文章主要给大家介绍了如何解决老版本goland无法调试新版本go的问题,文中通过代码示例给大家讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • golang实现跨域访问的方法

    golang实现跨域访问的方法

    这篇文章主要介绍了golang实现跨域访问的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Golang中make与new使用区别小结

    Golang中make与new使用区别小结

    Go语言中new和make是内建的两个函数,主要用来创建分配类型内存,本文主要给大家介绍了Go语言中函数new与make的使用和区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Go  iota 常量基本语法介绍

    Go  iota 常量基本语法介绍

    这篇文章主要介绍了Go 为什么要设计 iota 常量,我们介绍了 Go 中 iota 的基本语法。同时基于历史资料针对 iota 到底是什么,为什么要这么叫,又有什么用进行了一番研究,需要的朋友可以参考下
    2022-06-06
  • 利用GO语言实现多人聊天室实例教程

    利用GO语言实现多人聊天室实例教程

    聊天室的实现大家应该都遇到过,这篇文章主要给大家介绍了关于利用GO语言实现多人聊天室的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2018-03-03
  • Go语言json编码驼峰转下划线、下划线转驼峰的实现

    Go语言json编码驼峰转下划线、下划线转驼峰的实现

    这篇文章主要介绍了Go语言json编码驼峰转下划线、下划线转驼峰的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 使用Go实现伪静态URL重写功能

    使用Go实现伪静态URL重写功能

    在Web开发中,伪静态URL已成为优化网站架构和提升SEO的常用技术手段,伪静态URL是一种介于动态URL和静态URL之间的解决方案,本文给大家介绍了如何使用Go实现伪静态URL重写功能,需要的朋友可以参考下
    2024-08-08
  • Golang学习之无类型常量详解

    Golang学习之无类型常量详解

    对于无类型常量,可能大家是第一次听说,但我们每天都在用,每天都有无数潜在的坑被埋下。本文就来和大家聊聊它的相关注意事项吧,希望对大家有所帮助
    2023-03-03
  • Go 使用os包操作环境变量的方法

    Go 使用os包操作环境变量的方法

    环境变量通常在程序启动时就已设置好,在需要的时候随时读取,Go使用简单的几个函数就可以对环境变量进行增删查改,本文给大家介绍Go 使用os包操作环境变量的方法,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Go语言利用正则表达式处理多行文本

    Go语言利用正则表达式处理多行文本

    在 Go 语言中处理多行文本的正则表达式时,换行符常常会导致意外的匹配结果,本文为大家整理了一些解决方法,有需要的小伙伴可以参考一下
    2024-11-11

最新评论