变量引用
组成一个package的多个文件,编译后实际上和一个文件类似,组成包的不同文件相互之间可以直接引用变量和函数,不论是否导出
go中对于变量(函数也是如此)使用首字母大小写来区别是否可引用. 首字母大写则能被其它包引用(不完全正常, 目前先这么理解).
1 | // cat main.go |
1 | // cat other.go |
在命令行下运行go run .
输出很正常
1 | 0 |
变量定义
var
var比较直接, 使用没有限制
1 | package main |
####:=
:=个人觉得是个比较好的设计, 干练简短, 虽然在开开始学的时候常常会用错
:=用于声明变量并初始化, 且只能用在函数中, 如果你在函数外使用:=会提示
non-declaration statement outside function body
1 | func main() { |
上面的错误提示,说没有一个新的变量, 原因就在于xx之前已经被定义了, 不能重复定义. 所以这里只能使用赋值
a := 100
这句话是声明了变量a, 且给a赋值100
make
1 | // make slice、map和channel,并且返回一个有初始值(非零)的类型 |
new
1 | // new 用于分配了零值填充的T类型的内存空间, 它返回了一个指针,指向新分配的类型T的零值 |
make跟new是两个用的比较多, 在这里只是简单介绍下, 后面会单独学习它们的区别
常量的定义
const
const跟其它语言的用法一样, 都是声明常量, 常量就是不能被改变的变量(当然通过常量指针还是可以修改的)
const 可以在任何地方使用
1 | package main |
iota
iota在const中比较特别, 因此特意提出来说一下
1 | const ( |
首先,iota是可以参与运算的, iota带表达式的都将应用到下面的常量
比如上面的1<< iota,此时等于0, 整个表达式的值为1
每二行, iota的值等于1了, 1 << 1, 整个表达式的值2
以此类推.
iota在const关键字出现时将被重置为0(const内部的第一行之前),从第一行开始, 每新增一行常量声明(不包括空行及注释)将使iota计数一次(iota可理解为const语句块中的行索引)。使用iota能简化定义,主要用于定义枚举,而且很有用
1 | const ( // iota在const内部的第一行之前就被初始化为0 |
const及iota可参考这里
常见基本类型零值
1 | // 常见的基本类型零值 |
有个比较特殊的零值nil
, 这个必须要单独说.
问题
如果把一个包分成多个文件,在IDE如vscode中run时,可提示如下错误
最开始的时候一脸茫然, 很明显是因为在ide运行的时候,执行的命令是go run main.go
, 只传入了一个main.go,而没有传递others.go, 因此找不到mainxx(), 在命令行下执行也会报同样的错误. 需要运行go run .
或者go run *.go
,另外, 最好不要形成循环引用, 如果两个文件需要相互引用的话, 引用第三方是个推荐的办法.