Go 语言内置对以下这些基本数据类型的支持:
数据类型 | |
---|---|
布尔类型 | bool |
整型 | int8、byte、int16、int、uint、uintptr 等 |
浮点类型 | float32、float64 |
复数类型 | complex64、complex128 |
字符串 | string |
字符类型 | rune |
错误类型 | error |
相较于 PHP,多出了字符类型(单个字符)、错误类型和复数类型,PHP 通过系统级配置函数 error_reporting 定义应用的错误报告级别,不区分单独的字符与字符串类型,Go 还对整型的精度及是否有符号(正数还是负数)做了区分,PHP 则只有一个 int
类型标识整型数据,另外 PHP 通过 float
和 double
来区分浮点型精度,这一点也是 Go 语言 和 PHP 不一样的地方。
此外,Go 语言也支持以下这些复合类型:
数据类型 | |
---|---|
指针 | pointer |
数组 | array |
切片 | slice |
字典 | map |
通道 | chan |
结构体 | struct |
接口 | interface |
PHP 并不支持指针类型,对于数组、切片、字典,PHP 则通过数组类型一网打尽,后面三个类型 PHP 也不支持,通道类型主要用于并发编程,结构体类似 PHP 中的类(class
),Go 语言还把接口单独作为一个类型提出来.
Go 语言中的布尔类型与 PHP 差不多,关键字为 bool
,可赋值且只可以赋值为预定义常量 true 和 false。示例代码如下:
var v1 bool
v1 = true
v2 := (1 == 2) // v2 也会被推导为 bool 类型
与 PHP 不同的是,Go 是强类型语言,变量类型一旦确定,就不能将其他类型的值赋值给该变量。因此,布尔类型不能接受其他类型的赋值,也不支持自动或强制的类型转换。以下的示例是一些错误的用法,会导致编译错误:
var b bool
b = 1 // 编译错误
b = bool(1) // 编译错误
PHP 中则支持类似的用法:
$b = true;
$b = 1;
$b = (bool)1;
在 Go 语言中,以下的用法才是正确的:
var b bool
b = (1!=0) // 编译正确
fmt.Println("Result:", b) // 打印结果为Result: true
此外,由于强类型的缘故,Go 语言在进行布尔值真假判断时,对值的类型有严格限制,在 PHP 这种弱类型语言中,以下这些值在进行布尔值判断的时候(使用非严格的 == 比较符)都会被认为是 false:
FALSE
本身而在 Go 语言中则不然,甚至不同类型的值直接不能使用 == 或 != 运算符进行比较,在编译期就会报错,比如下面这段代码:
b := (false == 0);
在编译的时候就会报如下错误:
cannot convert 0 (type untyped number) to type bool
invalid operation: false == 0 (mismatched types bool and int)
同样,!
运算符也不能作用于非布尔类型值。
整型是所有编程语言里最基础的数据类型,Go 语言默认支持如下这些整型类型:
类型 | 长度(单位:字节) | 说明 | 值范围 | 默认值 |
---|---|---|---|---|
int8 | 1 | 带符号8位整型 | -128~127 | 0 |
uint8 | 1 | 无符号8位整型,与 byte 类型等价 | 0~255 | 0 |
int16 | 2 | 带符号16位整型 | -32768~32767 | 0 |
uint16 | 2 | 无符号16位整型 | 0~65535 | 0 |
int32 | 4 | 带符号32位整型,与 rune 类型等价 | -2147483648~2147483647 | 0 |
uint32 | 4 | 无符号32位整型 | 0~4294967295 | 0 |
int64 | 8 | 带符号64位整型 | -9223372036854775808~9223372036854775807 | |
uint64 | 8 | 无符号64位整型 | 0~18446744073709551615 | 0 |
int | 32位或64位 | 与具体平台相关 | 与具体平台相关 | 0 |
uint | 32位或64位 | 与具体平台相关 | 与具体平台相关 | 0 |
uintptr | 与对应指针相同 | 无符号整型,足以存储指针值的未解释位 | 32位平台下为4字节,64位平台下为8字节 | 0 |
未完待续…