学做美食交流网站,网站的建设步骤包括,零基础学ui设计怎么样,外贸网络推广营销常量#xff1a;Go 在“常量”设计上的创新有哪些#xff1f;
Go 语言在常量方面的创新包括下面这几点#xff1a; 支持无类型常量#xff1b;支持隐式自动转型#xff1b;可用于实现枚举。
常量
Go 语言的常量是一种在源码编译期间被创建的语法元素。这是在说这个元素…常量Go 在“常量”设计上的创新有哪些
Go 语言在常量方面的创新包括下面这几点 支持无类型常量支持隐式自动转型可用于实现枚举。
常量
Go 语言的常量是一种在源码编译期间被创建的语法元素。这是在说这个元素的值可以像变量那样被初始化但它的初始化表达式必须是在编译期间可以求出值来的。 Go 常量一旦声明并被初始化后它的值在整个程序的生命周期内便保持不变。我们在并发设计时不用考虑常量访问的同步并且被创建并初始化后的常量还可以作为其他常量的初始表达式的一部分。 Go 是使用 var 关键字声明变量的。在常量这里Go 语言引入 const 关键字来声明常量。而且和 var 支持单行声明多个变量以及以代码块形式聚合变量声明一样const 也支持单行声明多个常量以及以代码块形式聚合常量声明的形式const Pi float64 3.14159265358979323846 // 单行常量声明
// 以 const 代码块形式声明常量
const (size int64 4096i, j, s 13, 14, bar // 单行声明多个常量
)Go 语言规范规定Go 常量的类型只局限于 Go 基本数据类型包括数值类型、字符串类型以及只有两个取值true 和 false的布尔类型。
无类型常量
Go 语言对类型安全是有严格要求的即便两个类型拥有着相同的底层类型但它们仍然是不同的数据类型不可以被相互比较或混在一个表达式中进行运算。这一要求不仅仅适用于变量也同样适用于有类型常量Typed Constant中。有类型常量与变量混合在一起进行运算求值的时候也必须遵守类型相同这一要求否则我们只能通过显式转型才能让代码正常工作。常量在声明时并没有显式地被赋予类型在 Go 中这样的常量就被称为无类型常量Untyped Constant。无类型常量也不是说就真的没有类型它也有自己的默认类型不过它的默认类型是根据它的初值形式来决定的。
隐式转型
隐式转型说的就是对于无类型常量参与的表达式求值Go 编译器会根据上下文中的类型信息把无类型常量自动转换为相应的类型后再参与求值计算这一转型动作是隐式进行的。但由于转型的对象是一个常量所以这并不会引发类型安全问题Go 编译器会保证这一转型的安全性。
实现枚举
Go 语言其实并没有原生提供枚举类型在 Go语言中我们可以使用 const 代码块定义的常量集合来实现枚举。首先Go 的 const 语法提供了“隐式重复前一个非空表达式”的机制const (Apple, Banana 11, 22Strawberry, GrapePear, Watermelon
)这个代码里常量定义的后两行并没有被显式地赋予初始值所以 Go 编译器就为它们自动使用上一行的表达式const (Apple, Banana 11, 22Strawberry, Grape 11, 22Pear, Watermelon 11, 22
)不过仅仅是重复上一行显然无法满足“枚举”的要求因为枚举类型中的每个枚举常量的值都是唯一的。所以Go 在这个特性的基础上又提供了“神器”iota。 iota 是 Go 语言的一个预定义标识符它表示的是 const 声明块包括单行声明中每个常量所处位置在块中的偏移值从零开始。同时每一行中的 iota 自身也是一个无类型常量可以自动参与到不同类型的求值过程中来不需要我们再对它进行显式转型操作。const (Apple, Banana iota, iota 10 // 0, 10 (iota 0)Strawberry, Grape // 1, 11 (iota 1)Pear, Watermelon // 2, 12 (iota 2)
)如果一个 Go 源文件中有多个 const 代码块定义的不同枚举每个 const 代码块中的 iota 也是独立变化的也就是说每个 const 代码块都拥有属于自己的 iota。每个 iota 的生命周期都始于一个 const 代码块的开始在该 const 代码块结束时结束。