go语言的未知类型 go语言gc( 三 )


iota比较特殊,可以被任务是一个可被编译器修改的常量,在每个const关键字出现时被重置为0,然后在下一个const出现之前每出现一个iota,其所代表的数字会自动加1.
3)枚举
1)int 和int32在Go语言中被认为是两种不同类型的类型
2)Go语言定义了两个浮点型float32和float64,其中前者等价于C语言的float类型,后者等价于C语言的double类型
3)go语言支持复数类型
复数实际上是由两个实数(在计算机中使用浮点数表示)构成,一个表示实部(real)、一个表示虚部(imag) 。也就是数学上的那个复数
复数的表示
实部与虚部
对于一个复数z=complex(x,y),就可以通过Go语言内置函数real(z)获得该复数的实部,也就是x , 通过imag(z)获得该复数的虚部,也就是y
4)数组(值类型,长度在定义后无法再次修改,每次传递都将产生一个副本 。)
5)数组切片(slice)
数组切片(slice)弥补了数组的不足,其数据结构可以抽象为以下三个变量:
6)Map 在go语言中Map不需要引入任何库,使用很方便
Go循环语句只支持for关键字,不支持while和do-while
goto语句的语义非常简单 , 就是跳转到本函数内的某个标签
今天就介绍到这里,以后我会在总结Go语言在其他方面比如并发编程、面向对象、网络编程等方面的不同及使用方法 。希望对大家有所帮助 。
关于反射在计算机科学领域,反射是指一类应用,它们能够自描述和自控制 。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果 , 调整或修改应用所描述行为的状态和相关的语义 。
每种语言的反射模型都不同,并且有些语言根本不支持反射 。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关的,只要包含这个包就可以使用 。
多插一句 , Golang的gRPC也是通过反射实现的 。
在讲反射之前,先来看看Golang关于类型设计的一些原则
接下来要讲的反射,就是建立在类型之上的,Golang的指定类型的变量的类型是静态的(也就是指定int、string这些的变量,它的type是static type) , 在创建变量的时候就已经确定 , 反射主要与Golang的interface类型相关(它的type是concrete type) , 只有interface类型才有反射一说 。
在Golang的实现中,每个interface变量都有一个对应pair,pair中记录了实际变量的值和类型:
value是实际变量值,type是实际变量的类型 。一个interface{}类型的变量包含了2个指针 , 一个指针指向值的类型【对应concrete type】 , 另外一个指针指向实际的值【对应value】 。
例如,创建类型为*os.File的变量,然后将其赋给一个接口变量r:
接口变量r的pair中将记录如下信息:(tty, *os.File) , 这个pair在接口变量的连续赋值过程中是不变的,将接口变量r赋给另一个接口变量w:
接口变量w的pair与r的pair相同 , 都是:(tty, *os.File) , 即使w是空接口类型,pair也是不变的 。
interface及其pair的存在,是Golang中实现反射的前提,理解了pair,就更容易理解反射 。反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制 。
既然反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制 。那么在Golang的reflect反射包中有什么样的方式可以让我们直接获取到变量内部的信息呢? 它提供了两种类型(或者说两个方法)让我们可以很容易的访问接口变量内容,分别是reflect.ValueOf() 和 reflect.TypeOf(),看看官方的解释

推荐阅读