从C++到Go(二)1
上一节讲完了概念差异,这节讲解语法
语法
声明语法和C++相反,类型跟在名字后面。类型的语法和变量的使用方式与C++不同。类型声明可以很容易地从左向右阅读。(var v1 int
-> 变量v1
是一个int
)
//Go C++
var v1 int // int v1;
var v2 string // const std::string v2; (approximately)
var v3 [10]int // int v3[10];
var v4 []int // int* v4; (approximately)
var v5 struct { f int } // struct { int f; } v5;
var v6 *int // int* v6; (but no pointer arithmetic)
var v7 map[string]int // unordered_map<string, int>* v7; (approximately)
var v8 func(a int) int // int (*v8)(int a);
声明通常采用关键字地形式,后跟要声明的对象的名称。关键字可以是var
, func
, const
, 或 type
中的一个。方法的声明是一个例外,因为方法的接收者出现在要声明的对象名称之前。
你也可以使用关键字,然后在圆括号中使用一系列声明。
var (
i int
m float64
)
当声明一个函数时,你必须为每个参数提供参数名或者不提供任何参数(也就是说,C++允许void f(int i, int);
但是Go不允许func f(i int, int)
)。为了方便,在Go中你可以将具有相同类型的多个名称分组:
func f(i, j, k int, s, t string)
变量可以在声明时初始化。完成此操作后,可以指定类型但不是必须的。当没有指定类型时,变量的类型为初始化表达式的类型
var v = *p
如果一个变量没有被显式初始化,则必须指定变量的类型。此时变量将被隐式初始化为类型的0值(0
, nil
等)。因此在Go中没有未初始化的变量。
在函数内部,存在一个简短的声明语法:=
v1 := v2 // C++11: auto v1 = v2;
这等价于
var v1