Golang中的类型

栏目: Go · 发布时间: 6年前

内容简介:golang中的有两种类型,静态类型:静态类型是在声明变量的时候指定的类型,一个变量的静态类型是永恒不变的,所以才被称为静态类型,也可以简称为类型,普通变量只有静态类型。动态类型:接口类型变量除了静态类型之外还有动态类型,动态类型是由给接口类型变量赋值的具体值的类型来决定的,除了动态类型之外还有动态值,动态类型和动态值是对应的,动态值就是接口类型变量赋值的具体值,之所以被称为动态类型,是因为接口类型的动态类型是会变化的,由被赋予的值来决定。

golang中的类型

golang中的有两种类型, 静态类型(static type) 动态类型(dynamic type)

静态类型:静态类型是在声明变量的时候指定的类型,一个变量的静态类型是永恒不变的,所以才被称为静态类型,也可以简称为类型,普通变量只有静态类型。

package main

import "fmt"

func main()  {
	// 变量i和变量g只有静态类型,变量i的类型为int,i的类型为main.Goose,
	var i int
	var g Goose
	fmt.Printf("%T\n", i)
	fmt.Printf("%T\n", g)
}

type Goose struct {
	age  int
	name string
}

执行结果:
int
main.Sparrow

动态类型:接口类型变量除了静态类型之外还有动态类型,动态类型是由给接口类型变量赋值的具体值的类型来决定的,除了动态类型之外还有动态值,动态类型和动态值是对应的,动态值就是接口类型变量赋值的具体值,之所以被称为动态类型,是因为接口类型的动态类型是会变化的,由被赋予的值来决定。

package main
import "fmt"
func main()  {
	// 动态类型
	var b Bird
	// b 是main.Sparrow类型
	b = Sparrow{}
	fmt.Printf("%T\n", b)
	// b 是main.Parrot类型
	b = Parrot{}
	fmt.Printf("%T\n", b)
}
type Bird interface {
	fly()
	sing()
}
// Goose implement Bird interface
type Sparrow struct {
	age  int
	name string
}
func (s Sparrow) fly()  {
	fmt.Println("I am flying.")
}
func (s Sparrow) sing()  {
	fmt.Println("I can sing.")
}
type Parrot struct {
	age  int
	kind int
	name string
}
func (p Parrot) fly()  {
	fmt.Println("I am flying.")
}
func (p Parrot) sing()  {
	fmt.Println("I can sing.")
}

执行结果:
main.Sparrow
main.Parrot

但是我们在变量 b 赋值之前直接获取它的类型会发现返回的结果是 nil ,这看起来很奇怪, interface 在Golang里也是一种类型,那它声明的变量的类型为什么是 nil 呢?

package main
import "fmt"
func main()  {
    // 动态类型
    var b Bird
    fmt.Printf("interface类型变量的类型:%T\n", b)
}
type Bird interface {
    fly()
    sing()
}

执行结果:
interface类型变量的类型:<nil>

首先我们需要明确,一个接口类型变量在没有被赋值之前,它的动态类型和动态值都是 nil 。在使用 fmt.Printf("%T\n") 获取一个变量的类型时,其实是调用了reflect包的方法进行获取的, reflect.TypeOf 获取的是接口变量的动态类型, reflect.valueOf() 获取的是接口变量的动态值。所以 fmt.Printf("%T\n",b) 展示的是 reflect.TypeOf 的结果,由于接口变量 b 还没有被赋值,所以它的动态类型是 nil ,动态值也会是 nil

对比来看,为什么只是经过了声明未赋值的变量的类型不是 nil 呢?就像在静态类型部分中所展示的那样。原因如下: 我们先来看一下 reflect.TypeOf 函数的定义, func TypeOf(i interface{}) Type{} ,函数的参数是一个 interface 类型的变量,在调用 TypeOf 时,在接口变量 b 没有赋值之前,它的静态类型与参数类型一致,不需要做转换,因为 b 的动态类型为 nil ,所以 TypeOf 返回的结果为 nil 。那为什么变量 i 和变量 g 的类型不为 nil 呢?当变量 i 调用 TypeOf 时,会进行类型的转换,将int型变量i转换为 interface 型,在这个过程中会将变量 i 的类型作为 b 的动态类型,变量 i 的值(在这里是变量 i 的零值0)作为 b 的动态值。因为 TypeOf() 获取的是变量 b 的动态类型,所以这个时候展示出的类型为 int

参考:

https://studygolang.com/articles/9331

https://studygolang.com/articles/11374

《go语言圣经》


以上所述就是小编给大家介绍的《Golang中的类型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

MATLAB在数学建模中的应用

MATLAB在数学建模中的应用

卓金武 编 / 北京航空航天大学 / 2011-4 / 34.80元

《MATLAB在数学建模中的应用》从数学建模的角度介绍了MATLAB的应用。《MATLAB在数学建模中的应用》的4位作者均具有实际的数学建模参赛经历和竞赛指导经验。书中内容完全是根据数学建模竞赛的需要而编排的,涵盖了绝大部分数学建模问题的MATLAB求解方法。 《MATLAB在数学建模中的应用》内容分上下两篇。上篇介绍数学建模中常规方法MATLAB的实现,包括MATLAB交互、数据建模、程序......一起来看看 《MATLAB在数学建模中的应用》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具