博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Go语言学习笔记1 变量,类型以及赋值

Posted on 2016-08-03 17:29  Mr.Victor  阅读(530)  评论(0编辑  收藏  举报

1.变量

1.1 声明变量

使用var关键字可以创建一个指定类型的变量:

var i int = 0
var i = 0
var i int

以上三个表达式均是合法的,第三个表达式会将i初始化为int类型的零值,0;如果i是bool类型,则为false;i是float64类型,则为0.0;i为string类型,则为"";i为interface类型,则为nil;i为引用类型,则为nil;如果i是struct,则是将struct中所有的字段初始化为对应类型的零值。

可以在同一条语句中声明多个变量:

var i, j, k int                 // int, int, int
var b, f, s = true, 2.3, "four" // bool, float64, string

 

包内可见的变量在main函数开始执行之前初始化,本地变量在函数执行到对应的声明语句时初始化。

变量也可以通过函数的返回值来初始化:

var f, err = os.Open(name) // os.Open returns a file and an error  

1.2 短声明

在函数内部,有一种短声明的方式,形式是name := expression,这里,变量的类型是由编译器自动确定的。

anim := gif.GIF{LoopCount: nframes}
freq := rand.Float64() * 3.0
t := 0.0

因为这种形式非常简洁,因此在函数内部(本地变量)大量使用。如果需要为本地变量显式的指定类型,或者先声明一个变量后面再赋值,那么应该使用var

1 i := 100                  // an int
2 var boiling float64 = 100 // a float64
3 var names []string
4 var err error
5 var p Point

就像var声明一样,短声明也可以并行初始化

i, j := 0, 1  

要谨记的是,:=是一个声明,=是一个赋值,因此在需要赋值的场所不能使用 :=

 

1 var i int  
2 i := 10//panic : no new variables on left side of :=  

 

可以利用并行赋值的特性来进行值交换:

1 i, j = j, i // swap values of i and j  

有一点需要注意的:短声明左边的变量未必都是新声明的!

1 in, err := os.Open(path1) //新声明两个变量:in, err  
2 //...  
3 out, err := os.Create(path2)   
4 /*因为err已经声明过,因此这里只新声明一个变量out。 
5 虽然这里使用:=,但是err是在上个语句声明的,这里仅仅是赋值*/  

而且,短声明的左边变量必须有一个是新的,若都是之前声明过的,会报编译错误:

1 f, err := os.Open(infile)  
2 // ...  
3 f, err := os.Create(outfile) // compile error: no new variables 

正确的写法是这样的:

1 f, err := os.Open(infile)  
2 // ...  
3 f, err = os.Create(outfile) // compile ok  

1.3 指针

 

  1. f, err := os.Open(infile)  
  2. // ...  
  3. f, err = os.Create(outfile) // compile ok