Go基础系列:常量和变量
常量(Constants)和iota
常量包含不会发生更改的数据。常量的数据类型只能是boolean、number(int/float/complex)或string。
定义方式:
const NAME [TYPE] = VALUE
TYPE基本可以省略,因为常量都是简单数据类型,编译器可以根据值推断出它的数据类型。
例如:
const Pi = 3.14159
常量在编译期间被评估,因此定义的常量必须是在编译期间就能计算出来的结果。例如调用一些运行期间的函数来生成常量的值就是错误的,因为在编译期间无法调用这些运行期间的函数。常量的值定义好后,无法在运行期间更改,否则会报错。
const c = 3+2 // 正确
const d = getNumber() // 错误
常量的精度可以随意长,Go不会出现精度溢出的问题。且常量赋值时,如果值太长,可以使用续行符\
:
const Ln2= 0.693147180559945309417232121458\
176568075500134360255254120680009
const Log2E= 1/Ln2
const Billion = 1e9
Go中只有将超出变量精度的值赋值给变量时才会出现溢出问题。
可以一次性定义多个常量:
const beef, two, c = "meat", 2, "veg"
const Monday, Tuesday, Wednesday = 1, 2, 3
const (
Monday, Tuesday, Wednesday = 1, 2, 3
Thursday, Friday, Saturday = 4, 5, 6
)
常量可以用枚举。定义了下面的常量后,Female就代表了数值1。
const (
Unknown = 0
Female = 1
Male = 2
)
可以使用iota
实现枚举,iota
自身是builtin包中定义的一个常量,其值为0,它用于在常量中定义序列数,从0开始增加:
const (
a = iota
b = iota
c = iota
)
当iota
第一次调用时,产生数值0,在新行中再次调用iota,将自动增加1,所以上面的a=0,b=1,c=2
。上面的常量枚举可以简写成等价形式:
const (
a = iota
b
c
)
iota不能用于运行期间,因为它是小写字母开头的常量,不会被导出。下面的代码会报错:iota未定义
var a int = iota
iota
也可以用于表达式中,例如iota+50
表示将当前的iota值加上50。
每个常量块(const block)结构都会重置和初始化iota的值为0。
func main() {
const a = iota // a=0
const b = iota + 3 // b=3
const c,d = iota,iota+3 // c=0,d=3
const (
e = iota // e=0
f = iota + 4 // f=5
g // g=6
)
println(a,b,c,d,e,f,g)
}
变量
在使用变量之前,有两个过程:声明变量、变量赋值。声明变量也常被称为"定义变量"。变量声明后必须使用,否则会报错。
定义变量的常用方式:
var identifier type
例如:
var a int
var b bool
var str string
// 或者
var (
a int
b bool
str string
)
当变量声明的时候,会做默认的赋0初始化,每种数据类型的默认赋0初始化的0值不同。例如int类型的0值为数值0,float的0值为0.0,string类型的0值为空"",bool类型的0值为false,数据结构的0值为nil,struct的0值为字段全部赋0。
变量在编译期间就可以获取到它的值,但如果赋值给变量的值需要经过运行期间的计算,则需要延迟到运行期间才能获取对应的值。
var a int = 15 // 编译期间赋值好
var b int = 15/3 // 编译期间赋值好
var c = getNumber() // 运行期间才赋值
声明和赋值可以结合:
var a int = 15
var i = 5
var b bool = false
var str string = "Hello World"
声明和赋值结合的时候,对于简单数据类型的值,可以省略type部分,因为Go可以根据值自己推断出类型:
var a = 15
var b = false
var str = "Hello World"
var (
a = 15
b = false
str = "Hello World"
numShips = 50
city string
)
因为要推断数据类型,所以类型推断操作是在运行期间完成的。
在使用推断类型的赋值时,如果想要指定特定类型,需要显式指定。例如整数数值推断的类型为int,要想让它保存到int64中,则必须显式指定类型:
var a int64 = 2
要推断类型必须是声明和赋值一起的,否则没有值,无法根据值去推断。例如var a
是错的。
除了上面的推断方式,通过:=
符号也能实现声明和赋值结合,它也会根据数据类型进行推断,连var关键字都省略了:
a := 50
但是:=
只能在函数代码块内部使用,在全局作用域下使用将报错,因为类型推断是在运行期执行的,而全局范围内的变量声明部分是在编译期间就决定好的。例如,下面的将报错:
a := 10
func main() { println(a) }
变量声明之后不能再次声明(除非在不同的作用域),之后只能使用=
进行赋值。例如,执行下面的代码将报错:
package main
import ("fmt")
func main(){
x:=10
fmt.Println("x =",x)
x:=11
fmt.Println("x =",x)
}
错误如下:
# command-line-arguments
.\test.go:8:3: no new variables on left side of :=
报错信息很明显,:=
左边没有新变量。
如果仔细看上面的报错信息,会发现no new variables
是一个复数。实际上,Go允许我们使用:=
一次性声明、赋值多个变量,而且只要左边有任何一个新变量,语法就是正确的。
func main(){
name,age := "longshuai",23
fmt.Println("name:",name,"age:",age)
// name重新赋值,因为有一个新变量weight
weight,name := 90,"malongshuai"
fmt.Println("name:",name,"weight:",weight)
}
需要注意,name第二次被:=
赋值,Go第一次推断出该变量的数据类型之后,就不允许:=
再改变它的数据类型,因为只有第一次:=
对name进行声明,之后所有的:=
对name都只是简单的赋值操作。
例如,下面将报错:
weight,name := 90,80
错误信息:
.\test.go:11:14: cannot use 80 (type int) as type string in assignment
另外,变量声明之后必须使用,否则会报错,因为Go对规范的要求非常严格。例如,下面定义了weight
但却没使用:
weight,name := 90,"malongshuai"
fmt.Println("name:",name)
错误信息:
.\test.go:11:2: weight declared and not used
变量作用域(scope)
Go语言的作用域采用的是词法作用域,意味着文本段定义所在位置决定了可看见的值范围。关于词法作用域和动态作用域,详细内容参见:一文搞懂:词法作用域、动态作用域、回调函数、闭包
- 定义在函数内部的变量为局部变量,只在函数内部可见
- 定义在代码块内(如
{...CODE...}
)的变量也是局部变量,除了代码块就消失 - 定义在代码块外、函数外的变量为包变量或者全局变量,它们可以被同一个目录下同一个包的多个文件访问(因为Go中一个目录下只能定义一个包,但一个包可以分成多个文件)
- 如果变量的名称以小写字母开头,则其它包不能访问该变量
- 如果变量的名称以大写字母开头,则其它包可以访问该变量
不同scope的变量名可以冲突,但建议采取名称唯一的方式为变量命名。
Go基础系列:常量和变量的更多相关文章
- Swift语言指南(一)--语言基础之常量和变量
原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swif ...
- 02_Swift2基础之常量和变量+注释+分号
1. 常量和变量 常量 和 变量 把一个名字(比如 'number' 或者 'welcomeMessage')和一个指定类型的值(比如数字'10'或者字符串 ' "Hello" ' ...
- JavaScript基础——JavaScript常量和变量(笔记)
JavaScript常量和变量(笔记) Javascript代码严格区分大小写. javascript暂不支持constant关键字,不允许用户自定义常量. javascript使用var关键字声明变 ...
- 二、JavaSE语言基础之常量与变量
1.常量 所谓常量值的是数据处理过程中值不能更改的数据. 2.变量 所谓变量值的是运算过程中值可以改变的数据,类似于代数中的未知数. 在Java语言中,使用变量时必须遵循先定义,而后赋值, ...
- java基础之常量与变量
概要:通过这段时间的工作,发现自己的基础还是很薄弱的,so,you know 常量 一种特殊的变量,程序运行过程中不能改变的值 语法格式:final 数据类型 常量名称 = 常量值 例子:fina i ...
- Java基础学习-常量和变量
1.常量概述 -在程序执行的过程中,其值不可以发生改变的量. 2.常量的分类 -字符串常量 用双引号括起来的内容("HelloWorld") -整数常 ...
- PHP基础之常量与变量
1.变量:用来存储信息的空间大小 $var 2.常量:定义之后不可以更改,标识符,并且给其赋值,常量是全局,在整个页面中均可使用,常量一般有英文字母.下划线.数字组成,开头不能是数字和$ 使用defi ...
- Java 基础系列之volatile变量(一)
一.锁 两种特性:互斥性(mutual exclusion).可见性(visibility).原子性(atomic) 互斥性就是一次只有一个线程可以访问该共享数据,可见性就是释放锁之前,对共享数据的修 ...
- Java之--Java语言基础组成(关键字、标识符、注释、常量和变量、运算符)
Java语言基础组成-关键字.标识符.注释.常量和变量.运算符 Java语言由8个模块构成,分别为:1.关键字:2.标识符(包名.类名.接口名.常量名.变量名等):3.注释:4.常量和变量:5.运算符 ...
- PHP 基础语法 常量 变量
PHP基础语法 标记 当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码.此种解析方式使得 PHP 可以被嵌入到各种 ...
随机推荐
- python生成exe文件
安装pyinstaller pyinstaller支持python2和python3 命令行安装:pip install pyinstaller pyinstaller --icon=duoguan. ...
- ubuntu安装苹果Windows以及微软雅黑consolas字体
ubuntu安装苹果Windows以及微软雅黑consolas字体 ubuntu安装苹果字体 wget http://drive.noobslab.com/data/Mac/macfonts.zip ...
- retrofit+rxjava封装
public class RetrofitHelper { private static OkHttpClient okHttpClient; private static ServiceAPI se ...
- 微信小程序------加导航
效果图如下 这个其实很简单 在app.json上面加点代码 "window":{ "backgroundTextStyle":"light" ...
- IntelliJ IDEA 和谐地址及快捷键
转载:http://my.oschina.NET/dyyweb/blog/494504 http://blog.csdn.net/tanlon_0308/article/details/5085473 ...
- java0618
1. java的基本数据类型,各占多少字节? byte 8位 short 16位 int 32位 long 64位 float 32位 double 64位 boolean 1位 char 16位 2 ...
- 黑群晖DS3617xs-DSM6.1.7up3/up2 开启ROOT用户,同时SATA改eSATA,挂载NTFS硬盘设置(二)
这两天闲来没事在某宝上搞了个黑群晖主机就j1900/4G小主机系统是DCM 6.1.7up3 15284版 网上修改的教程很多,走了好多弯路终于搞定我的黑群NAS,现分享给各位道友,有不足的地方请给位 ...
- C++的用法心得
在报这个专业之前就听说C++很难,c++学习了俩个学期,感觉真的很难.自己学着学着就有点放弃了 ,课上没认真听 ,课下也没花时间,就这样浑浑噩噩的度过了大一上学期.后来班主任开班会说学计算机的一定要学 ...
- VSCode插件开发全攻略(二)HelloWord
更多文章请戳VSCode插件开发全攻略系列目录导航. 写着前面 学习一门新的语言或者生态首先肯定是从HelloWord开始. 您可以直接克隆我放在GitHub上vscode-plugin-demo 的 ...
- 从构建分布式秒杀系统聊聊WebSocket推送通知
秒杀架构到后期,我们采用了消息队列的形式实现抢购逻辑,那么之前抛出过这样一个问题:消息队列异步处理完每个用户请求后,如何通知给相应用户秒杀成功? 场景映射 首先,我们举一个生活中比较常见的例子:我们去 ...