2019独角兽企业重金招聘Python工程师标准>>>
数据类型
go语言的数据类型非常丰富,包括int,string,boolean,byte,array,切片,映射等数据类型。当然用户还可以自定义数据类型。
各种数据类型的默认值
从这里我们总结一下go语言中各种类型变量的默认值:
- int类型,默认值为0
- string类型,默认值为空字符串
- boolean类型,默认值为false
- byte类型,默认值为0
- 指针类型,默认值为nil(以后讨论)
- 引用类型,默认值为每一个属性对应的类型的默认值
go变量声明方式
go语言中采用类似js的方式来声明变量,看下面的代码:
var num int //声明一个int类型的变量
var str string //声明一个string类型的变量
num1 := 10 //声明并初始化一个int类型的变量,注意这里不写var
var num2 int = 11 //声明并初始化int类型的变量
看下面的代码:
package main
import "fmt"
func main(){
var num int = 10
num1 := 11
var str string = "hello";
fmt.Println("num=",num);
fmt.Println("num1=",num1);
输出结果:
到现在,我们应该知道,怎么来声明一个变量。
变量的作用域
在上面例子中,在main函数钟声明的变量,都属于-局部变量。
既然有局部变量,那就会有全局变量,在go语言里面,因为每一个程序都会属于一个包,在这个包里面定义的变量,可以在变量所属包的里面任何位置使用。 例如:
package main
import "fmt"
var globalVar int = 20
func main(){
fn()
fmt.Println("globalVar=",globalVar)
}
func fn(){
//这里也可以访问到globalVar
var temp int = globalVar + 1
fmt.Println("globalVar+1=",temp)
}
这样看,好像go语言里面的作用域和js(es5之前)中的差不多,在函数中定义的变量只能在函数中使用,在包里面定义的变量可以在包里的任意位置使用。
那么,在go语言里面有没有包级别的私有变量呢,也就是说只有在变量定义的包内能访问,而在其他的包里面,访问不了。答案是有的,来看下面的例子:
包的使用和包级别的私有变量
这里我们新建一个新的目录p,用来存储p这个包下面的所有文件,注意,在同一个目录下的文件的package必须一致,否则会报错。
p1.go
package p
import "fmt";
//这个外界可以访问
var PVar int = 10
//这个是包私有的,外界不能访问
var str string = "hello zhongzhong"
//这个外界也可以访问
func Fn(){
fmt.Println("from p package")
}
main.go
package main
import (
"fmt"
"./p"
)
func main(){
fmt.Println("p.PVar=",p.PVar)
// fmt.Println("p.str=",p.str);
p.Fn();
}
可以看到,我们可以在main.go里面通过import导入我们自定义的包,然后使用里面的函数和变量。
如果去掉上面的main函数中的注释,再次执行main.go,会出现以下的错误:
可以看到,错误信息提示,不能引用未导出的名称p.str,接着下面就提示了说p.str未定义。
通过上面的代码,你应该已经猜到,go语言中是如何来处理包级别的私有变量了吧。
在go语言中,如果在一个包中定义的变量或者函数需要在别的包中使用,则需要将变量名或者函数名的首字母大写,如果不想被其他的包访问的话则使用首字母小写的方式。
总结
在go语言中,我们可以看到类似js的var的声明变量的方式,但是go是强类型的语言。在go语言中,我们可以通过包来组织我们的代码结构,并且go语言支持包级别的私有变量,这在js中,我们需要通过闭包等手段来模拟的私有变量在go语言 中得到了支持。go语言的行末不需要加分号,但是加了分号也不会报错。