上一篇已经说了,Go的语法和C的很接近,直接看看异同即可。
变量
变量名还是一样,字母或下划线开头,区分大小写。不能是关键字。
Go定义了int32和int64这种类型来显示声明大小,和C里面的short和long一样。
Go的变量定义有以下几种方式:
var v1 int //类型在后面
var v3 , v4 int //多个变量
var v5 = 10 //初始化
v5 := 10 //初始化
//下面这种算重复定义
var v6 int
v6 := 10 //err
Go比较厉害的是支持多个返回值了,所以:
var v2, v3, v4 int
v2, v3, v4 = 1, 2, 3 //多重赋值
i := 10
j := 20
i, j = j, i //交换变量
Go还支持匿名变量,表示抛弃:
_, i, _, j := 1, 2, 3, 4 //i=2 j=4
常量
常量用const。
const Pi float64 = 3.14
const zero = 0.0 // 浮点常量, 自动推导类型
const ( // 常量组
size int64 = 1024
eof = -1 // 整型常量, 自动推导类型
)
const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值
const a, b, c = 3, 4, "foo"
// a = 3, b = 4, c = "foo" //err, 常量不能修改
常量枚举
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)//0 1 2 ha ha 100 100 7 8
类型
类型和C差不多,但是不支持隐式转换了,都需要显示转换,而且转换只能发生在两种相互兼容的类型之间。比如:
//布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换
var b bool
b = 1 // err, 编译错误
b = bool(1) // err, 编译错误
bool转int
func bool2int(b bool) int {
if b {
return 1
}
return 0
}
int转bool
func int2bool(i int) bool {
return i != 0
}
字符和字符串
byte就是char,也就是int8,存的还是ASCII码。
字符串string,双引号,末尾还是有个‘\0’。
字符串之间可以用加号拼接。
格式化输入输出
格式和C一样,只是包换成了fmt
//整型
a := 15
fmt.Printf("a = %b\n", a) //a = 1111
fmt.Printf("%%\n") //只输出一个%
//字符
ch := 'a'
fmt.Printf("ch = %c, %c\n", ch, 97) //a, a
输入:
var v int
fmt.Println("请输入一个整型:")
fmt.Scanf("%d", &v)
//fmt.Scan(&v)
fmt.Println("v = ", v)
运算符
运算符和C里面没有什么区别。
流程控制
- if - else 条件语句
- switch - case 选择语句
- for - range 循环语句
- goto 无条件跳转语句
- defer 延迟执行
有变化的:
- case默认带break
- range可以用来遍历string/array/slice/map,第一个返回值是元素的数组下标,第二个返回值是元素的值。
s := "abc"
for i := range s { //支持 string/array/slice/map。
fmt.Printf("%c\n", s[i])
}
for _, c := range s { // 忽略 index
fmt.Printf("%c\n", c)
}
for i, c := range s {
fmt.Printf("%d, %c\n", i, c)
}
- goto语句和标签之间不能有变量定义
defer单独开一篇讲吧。