名称
Go中函数、变量、常量、类型、语句标签和包的命名规则与C语言一致:名称开头只能是一个字母(a-z和A-Z)或者下划线”_“,后面可以跟任意数量的字母、数字(0-9)或者下划线,Go的名称区分大小写。
Go有25个内置名称,有其特殊含义,只能用在语法所允许的地方,不能用作用户自定义的实体的名称:
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
另外还有三十几个内置的预声明常量、类型和函数,它们允许用户使用,但是这会有冲突的危险:
//常量:
true
false
iota
nil
//类型:
int
int8
int16
int32
int64
uint
uint8
uint16
uint32
uint64
uintptr
float32
float64
complex128
complex64
bool
byte
rune
string
error
//函数:
make
len
cap
new
append
copy
close
delete
complex
real
imag
panic
recover
声明在函数体内的实体只在函数局部有效。声明在函数体外的实体的开头字母的大小写决定其可见性是否跨包,若名称以大写字母开头,则它是导出的,意味着它对包外是可见和可访问的,可以被自己包之外的其他程序所引用。包名总是由小写字母组成。
Go对名称的最大长度没有限制。
声明
声明是给一个实体命名,并且设定其部分或者全部属性。Go中有4种声明:变量声明(var)、常量声明(const)、类型声明(type)、函数声明(func)。
声明在函数体外的变量是包级别的声明,包级别的实体名字不仅对包含其声明的源文件可见,而且对于同一个包内的所有源文件可见。声明在函数体内部的声明是局部声明,仅仅在函数体内部可见,甚至其可见性仅止于函数体中的一小块区域,如循环结构中声明的变量其可见性仅止于循环体内部。
变量
变量的声明使用关键字var,var声明创建一个具体类型的变量,然后为此变量命名,初始化该变量。变量声明的通用形式是:
var varName type = expression
**变量声明中的type(类型)和expression(表达式)可以省略其中一个,但是不能都省略。**若省略类型,则变量的类型由表达式的值决定;若省略表达式,则变量的初始值是其类型定义的”零值“:
- 数字是0;
- 布尔值是false
- 字符串是空串”“
- 接口引用类型(slice、指针、map、通 道、函数)是nil;
- 数组或者结构体这样的符合类型的零值是其所有元素或者成员的零值。
由于零值保障,Go中不存在没有初始值的变量。
可以声明一个变量列表,使用对应的表达式列表对其初始化。忽略类型时可以使用列表类声明多个类型不同的变量。
//使用列表来声明多个类型不同的变量
var b, f, s = true, 2, 3, "four"
初始值设定可以是字面量值或者任意的表达式。包级别的初始化在main函数开始执行前进行,局部变量的初始化和声明一样,在函数执行期间进行。
变量可以通过调用可以返回多个值的函数进行初始化:
//os.Open()函数返回一个文件和一个错误
var f, err = os.Open(name)
短变量声明
在函数中,一种称作短变量声明的可选形式可以用来声明和初始化局部变量。短变量声明的形式,name的类型由表达式类型决定:
name := expession
因短变量声明短小、灵活,故而在局部变量的声明和初始化中主要使用短变量声明。
多个变量可以用短变量声明的方式声明和初始化。
短变量声明最少声明一个新变量,否则,代码将无法编译通过。
指针
Go中返回局部变量的地址是非常安全的。
//调用函数f,将f中局部变量v的地址返回给p,即使在函数调用结束后,v的地址没有被回收,p的值仍然是该地址值,这是与我们在C语言中不能返回局部变量的地址的不同之处
var p = f()
func f() *int {
v := 1
return &v
}
new函数
未完待续…