GO语言基础篇(四)- 变量声明

717 阅读6分钟

这是我参与8月更文挑战的第 4 天,活动详情查看: 8月更文挑战

本文主要分享GO语言中定义合法的名称以及Go语言中的变量(var)、常量(const)、类型(type)和函数(func)的声明,并且介绍了变量的声明及赋值

程序结构(一)

名称

Go中函数、变量、常量、类型、语句标签和包的名称遵循一个简单的规则:名称的开头是一个字母(Unicode中的字符即可)或下划线,后面可以跟任意数量的字符、数字或下划线,并区分大小写

Go中有25个像if和switch这样的关键字,只能用在语法允许的地方,它们不能作为名称

breakdefaultfuncinterfaceselect

casedefergomapstruct

chanelsegotopackageswitch

constfallthroughifrangetype

continueforimportreturnvar

另外,还有三十几个内置的预声明的常量、类型和函数

常量:
		 truefalseiotanil
类型:
		 intint8int16int32int64
		 uintuint8uint16uint32uint64uintptr
		 float32float64complex64complex128
		 boolbyterunestringerror
函数:
		 makelencapnewappendcopyclose
		 deletecomplexrealimagpanicrecover

如果一个实体在函数中声明,它只在函数局部有效。如果声明在函数外,它将对包里边的所有源文件可见。实体第一个字母的大小写决定其可见性是否跨包。如果名称以大写字母开头,意味着它对包外是可见和可访问的,可以被自己包之外的其它程序所引用,像fmt包的Printf函数。包名本身总是由小写字母组成

名称本身没有长度限制,但是Go的编程风格倾向于使用短名称,特别是作用域较小的局部变量。通常,名称的作用域越大,就使用越长且更有意义的名称

声明

声明给一个程序实体命名,并且设定其部分或全部属性。有4个主要的声明:变量(var)、常量(const)、类型(type)和函数(func)

Go程序存储在一个或多个以.go为后缀的文件里。每一个文件以package声明开头,表明文件属于哪一个包。package声明后是import声明,然后是包级别的类型、变量、常量、函数的声明,不区分顺序。下边的程序声明一个常量、一个函数和一对变量

package main

import "fmt"

const boilingF = 212.0 //声明一个常量

func main() {
	var f = boilingF   //声明一个变量
	var c = (f-32) *5 / 9
	fmt.Printf("boiling ponit = %gF or %gC\n", f, c)
}

常量boilingF是一个包级别的声明(main包),f和c是属于main函数的局部变量。**包级别的实体名字不仅对于包含其声明的源文件可见,而且对同一个包里边的所有源文件都可见。**另一方面,局部声明仅仅是在声明所在的函数内可见,并且可能对于函数中的一小块区域可见

函数的声明包含一个名字、一个参数列表(由函数的调用者提供的变量)、一个可选的返回值列表,以及函数体(其中包含具体的函数语句)。如果函数不返回任何内容,返回值列表可以省略(函数会在后边的文章中单独分享)

变量

var声明创建一个具体类型的变量,然后给它附加一个名字,设置它的初始值。每一个声明有一个通用的形式

var name type = expression

类型和表达式部分可以省略一个,但是不能都省略。如果类型省略,则它的类型将由初始化表达式决定。如果表达式省略,其初始值对应于类型的零值。对于数字,零值是0,对于布尔值是false,对于字符串是"",对于接口和引用类型(slice、指针、map、通道、函数)是nil。对于一个像数组或结构图这样的复合类型,零值是其所有元素或成员的零值

var s string
fmt.Printfln(s)//""

上例中会输出一个空字符串,而不是一些错误或不可预料的行为

可以声明一个变量列表,并选择使用对应的表达列表对其初始化

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返回一个文件和一个错误

短变量声明

在函数中,一种称作短变量声明的可选形式可以用来声明和初始化局部变量。形式如下

name := expression//name的类型由expression的类型决定

a := 1
b := 2.3
c := true
d := "abcd"

因其短小灵活,因此在局部变量的声明和初始化中主要使用这种短声明。var声明通常是为那些跟初始化表达式类型不一致的局部变量保留的,或者用于后面才对变量赋值以及变量初始值不重要的情况

i := 100//int 类型
var boiling float64 = 100//float64类型

var names []string
var err error
var p Point

与var声明一样,多个变量可以以短变量声明的方式声明和初始化

i,j := 1,2

只有当他们对于可读性有帮助的时候才使用多个初始化表达式来进行变量声明,例如短小且天然一组的for循环的初始化。 :=是声明、而=是赋值。一个多变量的声明,不能和多重赋值(后边会介绍多重赋值)搞混,后者将右边的值赋给左边的对应变量

i,j = j,i//交换i和j的值(多重赋值)

与普通的var声明类似,短变量声明也可以用来调用像os.Open那样返回两个或多个值的函数

f,err := os.Open(name)
if err != nil {
		return err
}
......
f.Close()

说明:短变量声明不需要声明所有在左边的变量。如果一些变量在同一个词法块中声明(后边会介绍),那么对于那些变量,短声明的行为等同于赋值。看例子

in, err := os.Open(infile)
......
out,err := os.Create(outfile)

第一条语句声明了in和err,第二条语句仅声明了out,但向已有的err赋了值

短变量声明最少声明一个新变量,否则,代码编译将无法通过

f, err := os.Open(infile)
......
f,err := os.Create(outfile)//编译错误,没有新的变量被声明

参考

《Go程序设计语言》—-艾伦 A. A. 多诺万

《Go语言学习笔记》—-雨痕