从这一篇开始正式的Go语言学习之旅,现在到了基础类型篇,介绍下Go语言的命令规则,变量命名等基础内容。
命名规则
go语言对命名要求比较多。比如包里面函数的可见性就是从名字的首字母大小写区分的。这块介绍下。
go语言的函数,变量等命名也是由字母或者下划线开头,后面可以家字母、数字、下划线。区分大小写。这块和C语言一样。
不过go里面有些关键字,我们是不可以把这些关键字作为名字的,列举下:
break, default,func,interface,select,case,defer,go,map,struct,chan,else,goto,package,switch,const,fallthrough,if,range,type,continue,for,import,return,var
这边我把在c里面不是关键字的用红字体标注了下,作为区分。可以发现不一样的还是挺多的。
有一点需要注意:在给函数,变量(函数外)命名时,如果首字母是大写,则这个变量包外面是可见的,比如fmt包里面的Printf,这样我们可以使用,如果是小写,则包外面不可见。
包名一般都是全部小写
命名风格的话,Go语言提倡Camel case,就是变量名字包含多个单词时,单词首字母大写作为边界区分,这块和linux风格不一样。在Go语言中,我们就按照"writeFunctionForYou"这个样子来就可以了。
声明规则
go语言里面有4个声明关键字:var,const,type,func。
这儿给一个简单的例子,后面继续介绍:
package main
import "fmt"
const freezingF = 32.0
func main() {
const boilingF = 212.0
fmt.Printf("%g F = %g C\n", freezingF, fToc(freezingF))
fmt.Printf("%g F = %g C\n", boilingF, fToc(boilingF))
}
func fToc(f float64) float64 {
return (f - 32) * 5 / 9
}
输出:
fox@fox:~/Documents/Go/chapter2/day1$ ./declare
32 F = 0 C
212 F = 100 C
变量声明
go语言的变量声明一般是下面形式:
var name type = expression
type和=expression中的任意一个可以省略。当省略type时,name的类型就由expression决定了,当省略=expression时,初始值就按照type的零值来了。比如数值就是0,boolean就是false,“”就是字符串,intreface或者引用类型就是nil。
也就是在Go语言中,不存在没有初始化的变量。
多个变量可以一块声明:
var i,j,k int
var b,f,s = 1,"hello", true
在函数里面的时候,还有一种简易变量声明,形式是
name :=expression
name的类型又expression的类型决定。在函数内部,这样使用的方式比较多,使用var仅仅是当函数内,一个变量的值在后面赋值的场景。
简易变量声明课可以像var一样同时声明多个变量
i,j :=0,1
需要注意的是:多个比那里一块简易声明的时候,如果里面有变量前面已经声明过了,那么这儿就对于那个变量来说,不是声明,而是赋值。但是使用简易声明多个变量时,一定要保证有一个变量前面没有被声明过。作用范围外的声明不算
指针
go里面也有指针。当时和c语言中的指针有些不一样。尤其是函数返回局部变量地址这块。下面介绍下:
var x int
p := &x
&x就是生成了指向x的指针。访问指针的值就是*p
指针的零值是nil,所以可以判断 p!=nil 来看p是否指向一个变量。
下面就是和C指针最大的区别了:返回一个函数局部变量的地址是合法的
File Edit Options Buffers Tools Help
package main
import "fmt"
func main() {
p := getPointer()
fmt.Println(*p)
}
func getPointer() *int {
i := 10
return &i
}
这样是没问题的,输出
fox@fox:~/Documents/Go/chapter2/day1$ ./pointer
10
这块应该就是因为go使用了垃圾回收算法,我们获取了一个变量的引用,所以这个变量不会被释放。
new
go语言里面也有new哦。我们可以使用new来创建一个变量。
回顾下c++中new和malloc的区别:
malloc不调用构造函数
new会调用构造函数
p: =new (int)
使用new和直接声明一个变量是没有区别的。
变量的生命周期
这块是这篇介绍的重点了哦
包级别的变量生命周期是整个程序执行时间。函数内的变量就看情况了。可能是调用完就释放,也可能是整个程序执行时间。
先介绍下go啥时候释放一个变量:
最最简单地介绍下,因为这个垃圾回收算法很复杂。用俗话来说就是一个变量再也不用的时候,就可以释放掉了。那go怎么直到一个变量是否还用呢?go可以维护一棵数,这个树上挂满了搜有的引用。这些引用来源于程序,这些引用指向的变量肯定是要用的,如果有些变量,树上的引用访问不到,就意味这这些变量不用了。于是就可以把他释放掉了。
C/C++中,我们有一个常识:局部变量存放到栈上,new/malloc变量存放到堆上。go语言里面不是了,go语言里面,存活时间短的放到栈上,时间长的放到堆上。也就是在go中,并不是你用new,就意味着是在对上开辟空间。
用例子说明下:
func shouwPoint() {
i:=1
p:=new(int)
fmt.Println(&i)
fmt.Println(p)
}
fox@fox:~/Documents/Go/chapter2/day1$ ./pointer
0xc82000a318
0xc82000a320
可以看到地址相邻
来一段c++的:
#include
int main()
{
int i=0;
int *p = new(int);
*p = 1;
std::cout
return 0;
}
fox@fox:~/Documents/Go/chapter2/day1$ ./a.out
0x7ffdf78e8fac
0x1040c20
地址明显不在一块。
总结
到了总结时间了,这篇主要就是介绍了go语言的变量命名,声明规则,接来下我们会讨论变量的赋值,类型声明等。
领取专属 10元无门槛券
私享最新 技术干货