Go语言规格说明书 之 变量声明(Variable/Short variable declarations)
go version go1.11 windows/amd64
本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语言的 变量声明(Variable declarations)和 简短变量声明(Short variable declarations)。
Go语言有两种 变量声明方式:普通的、简短的。
普通的 方式 需要 使用 var关键字,简短的需要使用 := 组合符号。
普通的 方式 可以在任何作用域使用,而 简短的 方式 仅限于 函数的作用域内,或者,函数内的 if、for、switch 等语句中使用。
下面分别介绍。
注意,本文说的是 变量声明,而不是变量定义、初始化,但也会包含一些定义、初始化的内容。
普通的变量声明方式
和Python类似,可以在一行声明一个变量,也可以同时声明多个变量(变量列表)。
对于多个变量的声明,其中可以存在 空标识符(_),表示忽略对应位置的 值的表达式列表中的值。
官文示例 及 解释:
var i int // 这里的类型 int 不能少
var U, V, W float64 // 声明三个变量,初始化为 float64的默认值 0.0。这样来看,每个 声明了的变量 都是有值得,只不过,有些是默认值。可以查看 zero value。
var k = 0 // 没有指定类型,但基于了初始值,那么,k的类型是什么呢?下面会进行测试,结果为 int
var x, y float32 = -1, -2 // 指定了类型,也提供了值列表
var ( // 这个还不太理解,前面某博文说这样的方式是定义 全局变量!
i int
u, v, s = 2.0, 3.0, "bar"
)
var re, im = complexSqrt(-1)
var _, found = entries[name] // map lookup; only interested in "found" // 空标识符(_)表示忽略函数返回的第一个值,只需要(关注)第二个
进一步测试:
func main() {
var x1 = 0
fmt.Println(typeof(x1))
var x2 = 0.0
fmt.Println(typeof(x2))
}
// 测试函数
func typeof(v interface{}) string {
return fmt.Sprintf("%T", v)
}
测试结果:
int
float64
关于声明的变量的类型:
如果声明语句中存在类型名称,那么,变量就是这个类型;
否则,变量的类型为各自的初始化的值的类型(前面说过,变量的类型、初始化值 不能都不存在),此时,如果值是一位未类型化的常量(an untyped constant),变量的类型就是这个常量转换后的默认类型——如上面的测试中,0的默认类型是int、0.0的默认类型是float64;如果值是一个未类型化的布尔值(an untyped boolean value),那么,变量的类型为bool。
注意,预定义值 nil 不能用于给一个 没有指明类型 的变量赋值(指明了就可以了吧)。
官文示例:
var d = math.Sin(0.5) // d is float64
var i = 42 // i is int
var t, ok = x.(T) // t is T, ok is bool // 不懂!还需要dig
var n = nil // illegal // 没有指定类型
注意,编译器会将函数体内 声明了却从未使用 的变量设置为非法,编译 自然就不能通过,程序也不能执行了。
简短的变量声明方式
前面的变量声明需要关键字 var,而这里是 禁止用它的,也不需要指定变量类型,也不需要使用单独的等号(=),,需要用 := 组合符号——必须的,其后是一个或多个值,或者返回一个或多个值得 表达式。
声明中没有类型,不代表 变量没有类型,其类型根据赋予它们的值类进行推断的(推断规则TBD,我要去找找文档)。
官方示例:
i, j := 0, 10
f := func() int { return 7 }
ch := make(chan int)
r, w := os.Pipe(fd) // os.Pipe() returns two values
_, y, _ := coord(p) // coord() returns three values; only interested in y coordinate
进阶:
比普通变量声明方式多了一个 重新声明变量(redeclare) 的特性。
重新定义 可以 认为是 重新给 前面声明的变量赋值,因此,新的值得类型要匹配。
还有一个关键要求:
重新声明变量 只能出现在 变量列表的声明方式中,而且,在这个变量列表中,至少存在着一个 新的非空变量。
我的测试:
a := 123 // 声明变量a,成功,int型 a := 321 // 失败,只是一个变量,而不是变量列表,删除,再测试 a := "str" // 类型错误,单个变量错误,删除上面所有,再测试
// ----翻篇----
v1, a := "v1", 123 // 声明两个变量 v1、a
v1, a := "v11", 123 // 失败,不存在一个新的非空变量,删除此句,再测试
v2, a := "v2", 123 // 和变量v2一起重新声明a,成功 a, v3 := 999, "v2" // 切换变量a在重新声明语句中的位置
再次提示,简短声明语句 仅限于 函数的作用域内,或者,函数内的 if、for、switch 等语句中使用。
本文完。
需要结合 作用域、类型初始化值等一起看,会获得更完整的知识。
Go语言规格说明书 之 变量声明(Variable/Short variable declarations)的更多相关文章
- Go语言规格说明书 之 类型声明(Type declarations)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 通道 发送语句(send) 和 接收操作符(receive)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 select语句(Select statements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 通道类型(Channel types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 内建函数(Built-in functions)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- *C语言有关指针的变量声明中的几个易错点
转至:http://my.oschina.net/ypimgt/blog/108265 Technorati 标签: 指针, typedef, const, define 我们都知道,至少听说过 ...
- Go语言规格说明书 之 词汇元素(Lexical elements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 接口类型(Interface types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 结构体类型(Struct types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
随机推荐
- 树链剖分&dfs序
树上问题 很多处理区间的问题(像是RMQ,区间修改).可以用线段树,树状数组,ST表这些数据结构来维护.但是如果将这些问题挪到了树上,就不能直接用这些数据结构来处理了.这时就用到了dfs序和树链剖分. ...
- Java:在不同界面样式下JPopupMenu与鼠标事件mousePressed表现的结果不同!
今天遇到一个郁闷的事儿: 在一个JFrame上放了一个JList元件,这个JList元件添加了鼠标事件: mouseReleased.mousePressed ... 其中,在mouseRelease ...
- linux下查找某文件关键字(grep 函数)
-e表示罗列出与关键字有关的行,“ABC”表示查找的关键字,/XXX/4.assoc.linear表示该路径下的文件 .assoc.linear
- 受限玻尔兹曼机(Restricted Boltzmann Machine,RBM)
这篇写的主要是翻译网上一篇关于受限玻尔兹曼机的tutorial,看了那篇博文之后感觉算法方面讲的很清楚,自己收获很大,这里写下来作为学习之用. 原文网址为:http://imonad.com/rbm/ ...
- 虚拟化技术之KVM
虚拟化技术之KVM 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是虚拟化 其实虚拟化技术已经不是一个新技术了,上个世纪六十年代IBM公司已经在使用,只不过后来(上个世纪八 ...
- HTTP协议和SOCKS5协议
HTTP协议和SOCKS5协议 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们平时上网的时候基本上是离不开浏览器的,尤其是搜索资料的时候,那么这个浏览器是如何工作的呢?用的又是 ...
- Unity PC端发布失败解决办法
Unity的PC端有时候发布的时候报错.原因可能是你的游戏里面使用了NGUI的label,而且字体选择的是unity自带的字体.因为支持中文.在选择unity自带的字体时最好都选一样的字体.如果一个l ...
- Random类(随机数)
前言:总是忘记怎么用.上网一查,都是些有的没的...... 最简单却最常用的方法:Random.Next方法 首先,为Random类实例化一个对象: Random n=new Random(); Ne ...
- WebMvcConfigurerAdapter已过时,替换接口或类
WebMvcConfigurerAdapter已经过时,在新版本2.x中被废弃,原因是springboot2.0以后,引用的是spring5.0,而spring5.0取消了WebMvcConfigur ...
- MySQL与宿主Linux之间交互式执行命令
在MySQL里面执行Linux的命令并返回结果 system commands root@localhost 11:36:23> system cal March 2017 Su Mo Tu W ...