Go语言(1)——程序结构

程序结构

  基础部分仅仅列举和其余语言不同的地方(C语言为例)。express

声明

  Go语言有四个主要声明:var、const、type、func,相似于C语言中的变量,常量,结构体和函数。性能优化

package main //代表文件属于哪一个包
import "fmt"
const boilingF = 212.0 //包级别声明,相似于全局变量
func main() {
    var f = bologna   //局部变量
    var c = (f-32)*5/9
    fmt.Printf("boiling point = %gF or %gC\n",f,c)  
        
}

 

变量使用

定义

  通用形式:var name type = expression,type和expression可省略一个。类型省略,由expression决定;表达式省略初始值对应零值。Go语言不存在未初始化的变量。  模块化

var b,f,s=true,2.3,"four"  //多类型声明

    短变量形式:name:=expression,类型由expression决定,仅仅初始化一个新的变量才能用,一样能够声明多个变量如: i,j:=0,1  仅仅对可读性有帮助的时候才用这种形式。函数

指针使用

  指针的概念和访问符号和C语言同样,只是定义时候不同而已。工具

  定义:*type性能

  指针类型的零值是nil。优化

new函数

  用法:new(T),建立一个T类型变量,初始化,并返回其地址。spa

  go语言里new不是一个关键字,能够重定义为另外的其余类型。若是使用new做为自定义变量名字,那么这个变量做用域内new函数就不能用了。指针

变量生命周期

  生命周期概念不在介绍,咱们知道变量生命周期能够根据它所分配的空间来定。可是go语言编译器选择使用堆或栈上的空间不是基于使用var或new关键字的。看个例子:blog

var global *int
func f(){
    var x int
    x = 1
    global = &x  
}
func g(){
y:=new(int)
*y=1
}

   按照C语言习惯,局部变量使用的是栈空间,但这里x必定使用堆空间,由于它在f函数返回以后还能够经过global访问,这种状况咱们称x从f逃逸。g函数返回后,y就不可访问了,可被回收,即使使用new,编译器也会在栈上分配*y。

  垃圾回收对于写出正确程序有巨大帮助,可是变量的生命周期是写出高效程序所必须的。记住它在性能优化时候是有好处的,由于每一次变量逃逸都须要一次额外的内存分配过程。

赋值

  go语言支持多重赋值。在实际更新变量前,右边全部的表达式被推演(即被计算出来),当变量同时出如今赋值符两侧时候特别有用。

  交换两个变量的值 x,y=y,x

  可是独立语句更易读。

  由于go语言函数支持多返回值,因此能够将不须要的值赋给空标识符 _,err = x.(T)

类型声明

  用法:type name underlying-type

  至关于C++的typedef关键字。

包和文件

  包的做用和其余语言中的库或模块做用相似,用于支持模块化、封装、编译隔离和重用。gopl.io/ch1/helloworld包文件存储在目录$GOPATH/src/gopl.io/ch1/helloworld中。

  每个包给他的声明提供独立的命名空间。

  包让咱们能够经过控制变量在包外面的可见性或导出状况来隐藏信息;管理标识符是否对外可见规则:导出标识符以大写字母开头

  导出的包级别的声明在同一个包的全部文件中可见,由于包级别的常量名字以大写字母开头,可使用packag.name来访问。

  package声明前面紧挨着文档注释对整个包进行描述。

导入

  go语言中每个包经过import来导入。语言的规范没有定义从哪来以及含义,这依赖于工具来解释。导入声明能够给导入的包一个短名字,用来在整个文件中引用包的名字。

  若是导入一个没有被引用的包,就会触发错误!!

  包的初始化从初始化包级别变量开始,在依赖已解析完毕的状况下,根据依赖的顺序进行。

 

var a = b+c //最后初始化a
var b = f() //而后初始化b
var c = 1 //首先初始化
func f() int {
    return c+1  
}

 

   若是包由多个文件组成,初始化按照编译器收到的文件顺序进行:go工具会在调用编译器前将.go文件进行排序。

相关文章
相关标签/搜索