Golang教程:常量
定义常量
常量(constant)表示固定的值,比如:5,-89,"I love Go",67.89 等等。
考虑如下程序:
var a int =
var b string = "I love Go"
上面的程序中, a 和 b 分别被赋值为常量 50 和 "I love Go"。关键字 const 用于指示常量,如 50 和 "I love Go"。在上面的代码中,尽管没有使用关键字 const 修饰 50 与 "I love Go",但它们在Go的内部表示为常量。
关键字 const 修饰的名字为常量,不能被重新赋予任何值。 因此下面的程序会报错:cannot assign to a。
package main
func main() {
    const a =  //allowed
    a =  //reassignment not allowed
}
常量的值必须在编译期间确定。因此不能将函数的返回值赋给常量,因为函数调用发生在运行期。
package main import (
"fmt"
"math"
) func main() {
fmt.Println("Hello, playground")
var a = math.Sqrt()//allowed
const b = math.Sqrt()//not allowed
}
在上面的程序中,a 是一个变量因此可以被赋值为函数 math.Sqrt(4) 的调用结果。(我们将在单独的教程中更详细的讨论函数)。而 b 是一个常量,它的值必须在编译期间确定,但是函数 math.Sqrt(4) 的调用结果只能在运行时被计算出来,因此在编译 const b = math.Sqrt(4) 时将会报错:error main.go:11: const initializer math.Sqrt(4) is not a constant.
字符串常量
字符串常量最简单的常量,通过了解字符串常量可以更好的理解常量的概念。
在Go中任何用双引号(")括起来的值都是字符串常量,比如 "Hello World","Sam" 都是字符串常量。
字符串常量是什么类型呢?答案是 无类型(untyped)。
像 "Hello World" 这样的字符串没有任何类型。
const hello = "Hello World"
上面的代码将 "Hello World" 赋给一个名为 hello 的常量。那么现在常量 hello 是不是就有了类型?答案是:No。hello仍然没有类型。
下面的代码中,变量 name 被赋值为一个无类型的常量 "Sam",它是如何工作的呢?
package main import (
"fmt"
) func main() {
fmt.Println("Hello, playground")
var name = "Sam" // 译者注:这里编译器需要推导出 name 的类型,
// 那么它是如何从无类型的常量 "Sam" 中获取类型的呢?
fmt.Printf("type %T value %v", name, name) }
答案是无类型常量有一个默认的类型,当且仅当代码中需要无类型常量提供类型时,它才会提供该默认类型。在语句 var name = "Sam" 中,name需要一个类型,因此它从常量 "Sam" 中获取其默认类型:string。
有没有办法创建一个有类型(typed)的常量?答案是:Yes。下面的代码创建了一个有类型常量
const typedhello string = "Hello World"
上面的代码中, typedhello 是一个字符串类型的常量。
Go是强类型语言。在赋值时混合使用类型是不允许的。让我们通过以下代码说明这是什么意思。
package main
func main() {
        var defaultName = "Sam" //allowed
        type myString string
        var customName myString = "Sam" //allowed
        customName = defaultName //not allowed
}
在上面的代码中,我们首先创建了一个变量 defaultName 并且赋值为常量 "Sam"。常量 "Sam" 的默认类型为 string,因此赋值之后,defaultName 的类型亦为 string。
下一行我们创建了一个新的类型 myString,它是 string 的别名。
(译者注:可以通过 type NewType Type 的语法来创建一个新的类型。类似 C 语言的 typedef 。)
接着我们创建了一个名为 customName 的 myString 类型的变量,并将常量 "Sam" 赋给它。因为常量 "Sam" 是无类型的所以可以将它赋值给任何字符串变量。因此这个赋值是合法的,customName 的类型是 myString。
现在我们有两个变量:string 类型的 defaultName 和 myString 类型的 customName。尽管我们知道 myString 是 string的一个别名,但是Go的强类型机制不允许将一个类型的变量赋值给另一个类型的变量。因此, customName = defaultName 这个赋值是不允许的,编译器会报错:main.go:10: cannot use defaultName (type string) as type myString in assignment
布尔常量
布尔常量与字符串常量(在概念上)没有区别。布尔常量只包含两个值:true 和 false。字符串常量的规则也同样适用于布尔常量,这里不再赘述。下面的代码解释了布尔常量:
package main
func main() {
    const trueConst = true
    type myBool bool
    var defaultBool = trueConst //allowed
    var customBool myBool = trueConst //allowed
    defaultBool = customBool //not allowed
}
上面的程序很好理解,这里就不过多解释了。
数值常量
数值常量(Numeric constants)包括整数,浮点数以及复数常量。数值常量有一些微妙之处。
让我们看一些例子使事情变得明朗。
package main import (
"fmt"
) func main() {
fmt.Println("Hello, playground")
const a =
var intVar int = a
var int32Var int32 = a
var float64Var float64 = a
var complex64Var complex64 = a
fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var)
}
上面的程序中,const a 是无类型的,值为 5。你也许想知道 a 的默认类型是什么?如果它有默认类型,那么它是怎么赋值给其他类型的变量的? 答案在于使用 a 时的上下文。我们暂时放下这两个问题,先来看下面的程序:
package main import (
"fmt"
) func main() {
fmt.Println("Hello, playground")
var i =
var f = 5.6
var c = + 6i
fmt.Printf("i's type %T, f's type %T, c's type %T", i, f, c)
}
在上面的程序中,所有变量的类型都是由数值常量决定的。在语法上看,5 在是一个整数,5.6 是一个浮点数, 5 + 6i 是一个复数。运行上面的程序,输出为:i's type int, f's type float64, c's type complex128
(译者注:编译器可以根据字面值常量的表现形式来确定它的默认类型,比如 5.6 表现为浮点数,因此它的默认类型为 float64 ,而 "Sam" 表现为字符串,因此它的默认类型为 stirng。)
现在应该很清楚下面的程序是如何工作的了:
package main import (
"fmt"
) func main() {
fmt.Println("Hello, playground")
const a =
var intVar int = a
var int32Var int32 = a
var float64Var float64 = a
var complex64Var complex64 = a
fmt.Println("intVar",intVar, "\nint32Var", int32Var, "\nfloat64Var", float64Var, "\ncomplex64Var",complex64Var)
}
在这个程序中,a 的值是 5 并且 a 在语法上是泛化的(它既可以表示浮点数 5.0,也可以表示整数 5,甚至可以表示没有虚部的复数 5 + 0i),因此 a 可以赋值给任何与之类型兼容的变量。像 a 这种数值常量的默认类型可以想象成是通过上下文动态生成的。var intVar int = a 要求 a 是一个 int,那么 a 就变成一个 int 常量。var complex64Var complex64 = a 要求 a 是一个 complex64,那么 a 就变成一个 complex64 常量。这很容易理解:)
数值表达式
数值常量可以在表达式中自由的混合和匹配,仅当将它们赋值给变量或者在代码中明确需要类型的时候,才需要他们的类型。
package main import (
"fmt"
) func main() {
var a = 5.9/
fmt.Printf("a's type %T value %v",a, a)
}
在上面的程序中,语法上 5.9 是一个浮点数,8 是一个整数。因为它们都是数值常量,因此 5.9/8 是合法的。相除的结果为 0.7375,是一个浮点数。因此变量 a 的类型为浮点型。上面的程序输出为:a's type float64 value 0.7375
本文摘自:https://blog.csdn.net/u011304970/article/details/74857146
Golang教程:常量的更多相关文章
- Golang的常量定义及使用案例
		
Golang的常量定义及使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常量的定义 package main import ( "fmt" ) fu ...
 - Golang教程:变量
		
声明单一变量 声明一个变量的语法为:var name type,例如 package main import "fmt" func main() { var age int // ...
 - (转载)golang 整数常量INT_MAX INT_MIN最大值最小值
		
转载地址:https://blog.csdn.net/bdss58/article/details/78388858 在C语言中,有标准库limits.h定义了一些最大最小值常量,例如int类型的最大 ...
 - golang:常量
		
今天写代码的时候才发现,go语言里面的常量不能是数组(例如:[2]byte) 于是想查一下资料搞清楚到底是什么原因导致的,从effective go查到如下介绍: 但是这里也仅仅就是介绍了一下常量类型 ...
 - golang基础--常量与运算符
		
常量与运算符 常量的定义 常量的值在编译时已经确定 常量的定义格式与变量的基本相同 等号的右侧必须是常量或者常量表达式 规范: 常量定义时建议都使用大写,单词之间使用大写 便于包的外部调用 如果只限于 ...
 - [Objective-C语言教程]常量(7)
		
常量指的是程序在执行期间不会改变的固定值.这些固定值也称为文字.常量可以是任何基本数据类型,如整数常量,浮点常量,字符常量或字符串文字.还有枚举常量.常量被视为常规变量,只不过它们的值在定义后无法修改 ...
 - Golang教程:指针
		
什么是指针 指针是存储一个变量的内存地址的变量. 在上图中,变量 b 的值是 156,存储在地址为 0x1040a124 的内存中.变量 a 存储了变量 b 的地址.现在可以说 a 指向b. 指针的声 ...
 - Golang教程:Map
		
什么是 map? Map 是 Go 中的内置类型,它将键与值绑定到一起.可以通过键获取相应的值. 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map.语法为:mak ...
 - Golang教程:数组和切片
		
数组 数组是类型相同的元素的集合.例如,整数 5, 8, 9, 79, 76 的集合就构成了一个数组.Go不允许在数组中混合使用不同类型的元素(比如整数和字符串). 声明 var variable_n ...
 
随机推荐
- Transaction And Lock--解决死锁/锁的几种有效方式
			
修改资源访问顺序,使多个事务对资源的访问方式一致优化查询SELECT,使得S锁能尽早释放均可能将更新和删除语句放到事务末端(使得X锁占用时间最小)避免事务执行期间暂停或等待外部输入将较大事务拆分成多个 ...
 - android hook getdeceiveid
			
很多手机软件使用了手机绑定.QQ,微信等.如果使用了不同的设备,则需要验证码. 要用一台手机来模拟与另一台手机一样环境,估计hook 系统的相关函数可以实现. 想着应该有现成的软件的,例如 smart ...
 - HAOI2010 最长公共子序列
			
题目链接:戳我 30分暴力....暴力提取子序列即可qwqwq #include<iostream> #include<cstdio> #include<algorith ...
 - 【leetcode 133. 克隆图】解题报告
			
方法一:dfs(递归) map<Node*,Node*> dict; Node* clone(Node* node) { if (!node) return node; if (dict. ...
 - OpenCV库文件介绍
			
以前都是直接用opencv,都没有仔细研究过,这次把库文件都介绍一下. 1.build和source 当我们安装完opencv中,你会发现在opencv文件夹中有两个文件夹,build和source, ...
 - vue和jQuery的区别
			
从jquery到vue或者说是到mvvm的转变是一个思想的转变,是将原有的直接操作dom的思想转变到操作数据上去 vue和jquey对比 jQuery是使用选择器($)选取DOM对象,对其进行赋值.取 ...
 - 模糊查询中Like的使用
			
通配符: %. _ %:表示任意个或多个字符.可匹配任意类型和长度的字符 _:表示任意单个字符.匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符) demo: //usern ...
 - leecode刷题(12)-- 整数反转
			
leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...
 - jquery事件二 -- 选项卡,失去焦点
			
以之前的选项卡例子为原版,当选上某一个选项卡的时候,选项卡周围会有一个蓝色的边框影响视觉体验,那么应该怎么去掉这个边框色呢?只需要加一行blur()--失去焦点函数就可以了 <!DOCTYPE ...
 - Nginx+Apache动静分离
			
Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术.动静分离技术其实是采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项 针对PHP的动 ...