内容简介:常量使用关键字 const 定义,用于存储不会改变的数据。存储在常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。常量的定义格式: const identifier [type] = value ,例如:
常量
常量使用关键字 const 定义,用于存储不会改变的数据。
存储在常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
常量的定义格式: const identifier [type] = value ,例如:
1. const Pi = 3.14159
在 Go 语言中,你可以省略类型说明符 [type] ,因为编译器可以根据变量的值来推断其类型。
显式类型定义: const b string = "abc"
隐式类型定义: const b = "abc"
一个没有指定类型的常量被使用时,会根据其使用环境而推断出它所需要具备的类型。换句话说,未定义类型的常量
会在必要时刻根据上下文来获得相关类型。
1. var n int2. f(n + 5) // 无类型的数字型常量 “5” 它的类型在这里变成了 int
常量的值必须是能够在编译时就能够确定的;你可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在
编译期间就能获得。
正确的做法: const c1 = 2/3
错误的做法: const c2 = getNumber() // 引发构建错误: getNumber() used as value
因为在编译期间自定义函数均属于未知,因此无法用于常量的赋值,但内置函数可以使用,如:len()。
数字型的常量是没有大小和符号的,并且可以使用任何精度而不会导致溢出:
1. const Ln2= 0.693147180559945309417232121458\2. 1765680755001343602552541206800093. const Log2E= 1/Ln2 // this is a precise reciprocal4. const Billion = 1e9 // float constant5. const hardEight = (1 << 100) >> 97
根据上面的例子我们可以看到,反斜杠 \ 可以在常量表达式中作为多行的连接符使用。与各种类型的数字型变量相比,你无需担心常量之间的类型转换问题,因为它们都是非常理想的数字。
不过需要注意的是,当常量赋值给一个精度过小的数字型变量时,可能会因为无法正确表达常量所代表的数值而导致溢出,这会在编译期间就引发错误。另外,常量也允许使用并行赋值的形式:
1. const beef, two, c = "eat", 2, "veg"2. const Monday, Tuesday, Wednesday, Thursday, Friday, Saturday = 1, 2, 3, 4, 5, 63. const (4. Monday, Tuesday, Wednesday = 1, 2, 35. Thursday, Friday, Saturday = 4, 5, 66. )
常量还可以用作枚举:
1. const (2. Unknown = 03. Female = 14. Male = 25. )
现在,数字 0、1 和 2 分别代表未知性别、女性和男性。这些枚举值可以用于测试某个变量或常量的实际值,比如使用 switch/case 结构.
变量
声明变量的一般形式是使用 var 关键字: var identifier type 。需要注意的是,Go 和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。Go 为什么要选择这么做呢?首先,它是为了避免像 C 语言中那样含糊不清的声明形式,例如: int* a, b; 。在这个例子中,只有 a 是指针而b 不是。如果你想要这两个变量都是指针,则需要将它们分开书写.而在 Go 中,则可以很轻松地将它们都声明为指针类型:
1. var a, b *int
其次,这种语法能够按照从左至右的顺序阅读,使得代码更加容易理解。
示例:
1. var a int2. var b bool3. var str string
你也可以改写成这种形式:
1. var (2. a int3. b bool4. str string5. )
这种因式分解关键字的写法一般用于声明全局变量。
当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,bool 为 false,string为空字符串,指针为 nil。记住,所有的内存在 Go 中都是经过初始化的。
变量的命名规则遵循骆驼命名法,即首个单词小写,每个新单词的首字母大写,例如: numShips 和 startDate 。
但如果你的全局变量希望能够被外部包所使用,则需要将首个单词的首字母也大写。
一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。如果一个变量在函数体外声明,则被认为是全局变量,可以在整个包甚至外部包(被导出后)使用,不管你声明在哪个源文件里或在哪个源文件里调用该变量。在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。
我们将会学习到像 if 和 for 这些控制结构,而在这些结构中声明的变量的作用域只在相应的代码块内。一般情况下,局部变量的作用域可以通过代码块(用大括号括起来的部分)判断。
尽管变量的标识符必须是唯一的,但你可以在某个代码块的内层代码块中使用相同名称的变量,则此时外部的同名变量将会暂时隐藏(结束内部代码块的执行后隐藏的外部同名变量又会出现,而内部同名变量则被释放),你任何的操作都只会影响内部代码块的局部变量。变量可以编译期间就被赋值,赋值给变量使用运算符等号 = ,当然你也可以在运行时对变量进行赋值操作。
示例:
1. a = 152. b = false
一般情况下,当变量a和变量b之间类型相同时,才能进行如 a = b 的赋值。声明与赋值(初始化)语句也可以组合起来。示例:
1. var identifier [type] = value2. var a int = 153. var i = 54. var b bool = false5. var str string = "Go says hello to the world!"
但是 Go 编译器的智商已经高到可以根据变量的值来自动推断其类型,这有点像 Ruby 和 Python 这类动态语言,只不过它们是在运行时进行推断,而 Go 是在编译时就已经完成推断过程。因此,你还可以使用下面的这些形式来声明及初始化变量:
1. var a = 152. var b = false3. var str = "Go says hello to the world!"
或:
1. var (2. a = 153. b = false4. str = "Go says hello to the world!"5. numShips = 506. city string7. )
不过自动推断类型并不是任何时候都适用的,当你想要给变量的类型并不是自动推断出的某种类型时,你还是需要显式指定变量的类型,例如:
1. var n int64 = 2
然而, var a 这种语法是不正确的,因为编译器没有任何可以用于自动推断类型的依据。变量的类型也可以在运行时实现自动推断,例如:
1. var (2. HOME = os.Getenv("HOME")3. USER = os.Getenv("USER")4. GOROOT = os.Getenv("GOROOT")5. )
这种写法主要用于声明包级别的全局变量,当你在函数体内声明局部变量时,应使用简短声明语法 := ,例如:
1. a := 1
下面这个例子展示了如何通过 runtime 包在运行时获取所在的操作系统类型,以及如何通过 os 包中的函数 os.Getenv() 来获取环境变量中的值,并保存到 string 类型的局部变量 path 中。
1. package main2.3. import (4. "fmt"5. "runtime"6. "os"7. )8.9. func main() {10. var goos string = runtime.GOOS11. fmt.Printf("The operating system is: %s\n", goos)12. path := os.Getenv("PATH")13. fmt.Printf("Path is %s\n", path)14. }
如果你在 Windows 下运行这段代码,则会输出 The operating system is: windows 以及相应的环境变量的值;如果你在 Linux 下运行这段代码,则会输出 The operating system is: linux 以及相应的的环境变量的值。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design and Analysis of Distributed Algorithms (Wiley Series on P
Nicola Santoro / Wiley-Interscience / 2006-10-27 / USD 140.95
This text is based on a simple and fully reactive computational model that allows for intuitive comprehension and logical designs. The principles and techniques presented can be applied to any distrib......一起来看看 《Design and Analysis of Distributed Algorithms (Wiley Series on P》 这本书的介绍吧!