阅读《Go程序设计语言》:从Java的视角掌握Go(二)

本人在阅读《Go程序设计语言》时,通过比较Java和Go的不同来快速掌握Go语言,这是第二篇。

基本数据

本章的主题是基础类型:数字、字符串和布尔类型。

整数

和Java不同的是,Go同时具备符号整数和无符号整数:int8、int16、int32、int64以及uint8、uint16、uint32、uint64;

Go还提供int和uint,它们的大小取决于所处的硬件平台和使用的编译器,在本人的机器上测试:

1
2
3
4
5
6
7
8
package main
import "unsafe"
func main() {
println(unsafe.Sizeof(int(0)))
println(unsafe.Sizeof(uint(0)))
}

输出为:

1
2
8
8

各占8个字节。

rune和byte分别是int32和uint8的同义词,所谓同义词就是它们满足前面提到的可赋值性:

1
2
3
4
5
6
7
8
9
var ww byte
var www uint8
var rr rune
var rrr int32
func main() {
fmt.Println(ww == www)
fmt.Println(rr == rrr)
}

输出结果是:

1
2
true
true

Go还存在一种无符号整数uintptr,它的大小不定,但可以存放指针;

和Java不一样的是,Go的取模运算符%只能用于整数;

Go没有>>>位运算符;

浮点数

和Java不一样的是,Go具有两种大小的浮点数float32和float64,他们的最大值分别是math.MaxFloat32和math.MaxFloat64,绝大多数情况优先使用float64,因为float32会迅速累计误差;

和Java一样,浮点数可写成小数形式,小数点前的数字可以省略,后面也可以省略:

1
2
3
4
5
6
func main() {
var ff01 = 1.
var ff02 = .7
println(ff01)
println(ff02)
}

在Go中正无穷大和负无穷大分别用+Inf和-Inf来表示,在Java中则用Infinity和-Infinity表示;

在Go中用代表0值的变量作为分母进行运算,得到的结果是NaN;

复数

略。

布尔值

和Java一样,&&表示逻辑乘法,||表示逻辑加法;

布尔值无法隐式转换成数值(0或1),需要手写函数变换:

1
2
3
4
i := 0
if b {
i = 1
}

字符串

和Java不同,由于Go的变量声明存在零值机制,在没有手动初始化之前,字符串变量默认为""

在Go中,子串生成操作s[i:j]产生新字符串,如果下标越界可以躲过IDE的检查,但是运行会触发宕机异常;

加号运算符可以连接两个字符串生成新的字符串;

Go提供了原生的字符串字面量的书写形式:`…`,例如:

1
2
3
4
5
func main() {
var s string = `asdads
asdad dsad`
println(s[3])
}

输出为:

1
97