Go For Go(2)基础类型篇

从这一篇开始正式的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语言的变量命名,声明规则,接来下我们会讨论变量的赋值,类型声明等。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180226G00ZYJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券