Golang参考手册,更多内容请参考http://golang.org
语言规范参考自https://golang.org/ref/spec
行注释: // comment content
段注释:/* comment content */
符号有4类:标识符、关键字、操作符和分隔符、字面常量
golang中,分号可省略
标识符即程序中的变量和类型,有一个或多个字母或数字组成,第一个字母必须字母开头。
identifier = letter { letter | unicode_digit }
标识符不能是golang中的保留关键字
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
如下所示即golang中的操作符,分隔符以及其他特殊符号
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^=
整形字面量是由一序列数字表示的整形常量,可由0或者0x作为其前缀,分别表示8进制和16进制数。
int_lit = decimal_lit | octal_lit | hex_lit .
decimal_lit = ( "1" … "9" ) { decimal_digit } .
octal_lit = "0" { octal_digit } .
hex_lit = "0" ( "x" | "X" ) hex_digit { hex_digit } .
42
0600
0xBadFace
170141183460469231731687303715884105727
Rune为Int32类型的别名,是一个以utf-8代码点(code point)表示的整形值。
字符串字面量是一串字符序列表示的字符串常量。golang中有两种类型:原生字符串(foo bar
)和解释后的utf-8形式的字符串(\u65e5\u672c\u8a9e
)。
golang中有布尔类型常量、rune常量、整形常量、浮点类型常量、字符串常量还有复数类型常量。其中,rune、整形、浮点型、复数型统称为数值型常量。
变量是持有值的存储空间,其值类型由变量类型而决定。
var x interface{} // x is nil and has static type interface{}
var v *T // v has value nil, static type *T
x = 42 // x has value 42 and dynamic type int
x = v // x has value (*T)(nil) and dynamic type *T
类型决定值以及指定在该值上的运算操作,类型可以显示指定,也可以不指定,而由编译器推断。
Type = TypeName | TypeLit | "(" Type ")" .
TypeName = identifier | QualifiedIdent .
TypeLit = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
SliceType | MapType | ChannelType .
类型可以关联方法,一个任意的T类型的方法包含所有以T类型为接受者的方法,而指针类型*T的方法则包含以*T或者T为接受者的方法。
golang中布尔类型为bool
, 值为true
或false
, 默认为false
数值类型代表一组整形或者浮点类型值,在golang中预声明的类型有
uint8 the set of all unsigned 8-bit integers (0 to 255)
uint16 the set of all unsigned 16-bit integers (0 to 65535)
uint32 the set of all unsigned 32-bit integers (0 to 4294967295)
uint64 the set of all unsigned 64-bit integers (0 to 18446744073709551615)
int8 the set of all signed 8-bit integers (-128 to 127)
int16 the set of all signed 16-bit integers (-32768 to 32767)
int32 the set of all signed 32-bit integers (-2147483648 to 2147483647)
int64 the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807)
float32 the set of all IEEE-754 32-bit floating-point numbers
float64 the set of all IEEE-754 64-bit floating-point numbers
complex64 the set of all complex numbers with float32 real and imaginary parts
complex128 the set of all complex numbers with float64 real and imaginary parts
byte alias for uint8
rune alias for int32
需要注意的是,这些类型的变量间不允许相互赋值或操作,不然会在编译时引起错误。
另外,还有一些预声明的以特殊方式实现大小的类型
uint either 32 or 64 bits
int same size as uint
uintptr an unsigned integer large enough to store the uninterpreted bits of a pointer value
即使int的长度也是32位,但是int和int32仍然不相同,并不可以互用。
类型为string
, 用内置的len
函数来计算其长度。
数组是单一类型的元素序列,元素的个数成为数组的长度,定义方式如下
ArrayType = "[" ArrayLength "]" ElementType .
ArrayLength = Expression .
ElementType = Type .
数组的长度也是数组类型的一部分,用内置函数len
来计算。
[32]byte
[2*N] struct { x, y int32 }
[1000]*float64
[3][5]int
[2][2][2]float64 // same as [2]([2]([2]float64))
slice是一种指向底层数组并能访问数组元素的描述形式,slice类型表示所有数组元素类型的slice集合,初始值为nil
(空值)
SliceType = "[" "]" ElementType
与数组一样,用内置的len
来获取长度,但还可用内置的cap
函数来获取容量。
slice是一种引用类型,因此创建slice时,用make
函数来分配内存
make([]T, length)
make([]T, length, capacity)
结构体是拥有字段或属性的集合,在结构体中可显示指定字段(标识符形式),也可以隐式指定(匿名字段),其中所有字段必须是唯一的。
StructType = "struct" "{" { FieldDecl ";" } "}" .
FieldDecl = (IdentifierList Type | AnonymousField) [ Tag ] .
AnonymousField = [ "*" ] TypeName .
Tag = string_lit .
// An empty struct.
struct {}
// A struct with 6 fields.
struct {
x, y int
u float32
_ float32 // padding
A *[]int
F func()
}
只声明类型而没有指定名称的字段叫做匿名字段,也称为嵌入字段或类型嵌入,嵌入类型须为T或者非接口型的*T类型,但T本身不能为指针类型。默认情况下,其非限定的类型名称则充当字段名。
// A struct with four anonymous fields of type T1, *T2, P.T3 and *P.T4
struct {
T1 // field name is T1
*T2 // field name is T2
P.T3 // field name is T3
*P.T4 // field name is T4
x, y int // field names are x and y
}
如下声明结构体的方式是非法的,因为字段名必须是唯一的结构体类型
struct {
T // conflicts with anonymous field *T and *P.T
*T // conflicts with anonymous field T and *P.T
*P.T // conflicts with anonymous field T and *T
}
篇幅所限,其余类型见下文
http://blog.csdn.net/scherrer/article/details/49201829