Go语言变量创建的五种方法
对于只有Python语言经验的朋友,也许会不太理解声明这个词,在Python中直接拿来就用,也不用声明类型啥的。
Go语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型。
变量在使用前,需要先声明。声明类型,就约定了你这个变量只能赋该类型的值。
声明一般有以下四种方法,其中前面两种同样也可用于定义常量,只需把关键字var变成const即可。
第一种:一行声明一个变量
var
其中var是关键字(固定不变),name是变量名,type是类型。
使用var,虽然只指定了类型,但是Go会对其进行隐式初始化,比如string类型就初始化为空字符串,int类型就初始化为0,float就初始化为0.0,bool类型就初始化为false,指针类型就初始化为nil。
若想在声明过程,顺便也初始化,可以这样写
varnamesting="Python编程"
在Go文件中的完整代码如下,为了不写重复性的代码,后续不再貼完整代码,只貼关键代码
packagemain import"fmt" funcmain(){ varnamestring="Python编程时光" fmt.Println(name) }
从右值(等号右边的值,rvalue)来看,明显是个string类型(这里要注意,在Python双引号与单引号等价,但在Go中双引号和单引号是不一样的,这里要一定要使用双引号,表示字符串,而在单引号表示rune类型的字符,这个后续会单独介绍),因此也可以将其简化为
varname="Python编程"
若你的右值带有小数点,在不指定类型的情况下,编译器会将你的这个变量声明为float64,但是很多情况下,我们并不需要这么高的精度(占用的内存空间更大)
这种情况下,推荐指定类型,不要偷懒
varratefloat320.89
第二种:多个变量一起声明
声明多个变量,除了可以按照上面写成多行之外,还可以写成下面这样
var( namestring ageint genderstring )
第三种:声明和初始化一个变量
使用:=(推导声明写法或者短类型声明法:编译器会自动根据右值类型推断出左值的对应类型。),可以声明一个变量,并对其进行(显式)初始化。
name:="Python编程" //等价于 varnamestring="Python编程" //等价于 varname="Python编程"
但这种方法有个限制就是,只能用于函数内部
第四种:声明和初始化多个变量
name,age:="wangbm",28
这种方法,也经常用于变量的交换
varaint=100 varbint=200 b,a=a,b
第五种:new函数声明一个指针变量
在这里要先讲一下,指针的相关内容。
变量分为两种普通变量和指针变量
普通变量,存放的是数据本身,而指针变量存放的是数据的地址。
如下代码,age是一个普通变量,存放的内容是28,而ptr是存放变量age值的内存地址:0xc000010098
packagemain import"fmt" funcmain(){ varageint=28 varptr=&age//&后面接变量名,表示取出该变量的内存地址 fmt.Println("age:",age) fmt.Println("ptr:",ptr) }
输出
age: 28
ptr: 0xc000010098
而这里要说的new函数,是Go里的一个内奸函数。
使用表达式new(Type)将创建一个Type类型的匿名变量,初始化为Type类型的零值,然后返回变量地址,返回的指针类型为*Type。
packagemain import"fmt" funcmain(){ ptr:=new(int) fmt.Println("ptraddress:",ptr) fmt.Println("ptrvalue:",*ptr)//*后面接指针变量,表示从内存地址中取出值 }
输出
ptraddress: 0xc000010098
ptrvalue: 0
用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外,我们还可以在表达式中使用new(Type)。换言之,new函数类似是一种语法糖,而不是一个新的基础概念。
如下两种写法,可以说是等价的
//使用new funcnewInt()*int{ returnnew(int) } //使用传统的方式 funcnewInt()*int{ vardummyint return&dummy }
以上不管哪种方法,变量/常量都只能声明一次,声明多次,编译就会报错。
但也有例外,这就要说到一个特殊变量:匿名变量,也称作占位符,或者空白标识符,用下划线表示。
匿名变量,优点有三:
- 不分配内存,不占用内存空间
- 不需要你为命名无用的变量名而纠结
- 多次声明不会有任何问题
通常我们用匿名接收必须接收,但是又不会用到的值。
funcGetData()(int,int){ return100,200 } funcmain(){ a,_:=GetData() _,b:=GetData() fmt.Println(a,b) }
补充:本内容主要讲了GO语言快速的5个特征:
- 值存储(有效的值处理和值存储,内存消耗少);
- 函数调用(采用Inlining内联优化技术)
- 强制的垃圾回收机制(转义化分析,如果没有引用,则进行回收);
- Go进程
- 堆栈管理(若旧内存太小,会重新分配新的大的堆栈,并复制旧内容到新内容中去)
总结
以上所述是小编给大家介绍的Go语言五种变量创建的方法,希望对大家有所帮助!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。