以下是 Go 中可用的基本类型
- bool
- Numeric Types
- int8, int16, int32, int64, int
- uint8, uint16, uint32, uint64, uint
- float32, float64
- complex64, complex128
- byte
- rune
- string
bool
bool类型表示布尔值,为true
或false
。
1 | package main |
在上面的程序中,a 被赋值true
,b 被赋值false
。
c 被赋值为a && b
。&&
运算符仅在 a
和 b
都为 true
时返回 true
。所以在这种情况下 c
是false
的。
当 a || b
为 true
时,运算符返回 true
。在这种情况下,d
被赋值为true
,因为 a
为true
。我们将获得该程序的以下输出。
1 | a: true b: false |
Signed integers
int8:表示 8 位有符号整数
大小: 8 位
范围: -128 到 127
int16:表示 16 位有符号整数
大小: 16 位
范围: -32768 到 32767
int32:表示 32 位有符号整数
大小: 32 位
范围: -2147483648 到 2147483647
int64:表示 64 位有符号整数
大小: 64 位
范围: -9223372036854775808 到 9223372036854775807
int:表示 32 位或 64 位整数,具体取决于底层平台。除非需要使用特定大小的整数,否则您通常应该使用int来表示整数。
大小: 32 位系统中的 32 位和 64 位系统中的 64 位。
范围: 32 位系统中的 -2147483648 到 2147483647 和 64 位系统中的 -9223372036854775808 到 9223372036854775807
1 | package main |
上面的程序将打印value of a is 89 and b is 95
在上面的程序中,a 是 int类型,而b 的类型是从分配给它的值中推断出来的 (95)。如上所述,int 的大小在 32 位系统中为 32 位,在 64 位系统中为 64 位。让我们继续验证这个说法。
可以在函数中使用%T
格式说明符打印变量的类型。Go 有一个unsafe包,它有一个Sizeof函数,它以字节为单位返回传递给它的变量的大小。应该小心使用unsafe包,因为使用它的代码可能存在可移植性问题,但出于本教程的目的,我们可以使用它。
以下程序输出变量 a 和 b 的类型和大小。%T
是打印类型的格式说明符,%d
用于打印大小。
1 | package main |
上面的程序将产生输出
1 | value of a is 89 and b is 95 |
我们可以从上面的输出推断出 a 和 b 的类型是int并且它们是32 位大小的(4 字节)。如果您在 64 位系统上运行上述程序,输出会有所不同。在 64 位系统中,a 和 b 占用 64 位(8 字节)。
Unsigned integers
uint8:表示 8 位无符号整数
大小: 8 位
范围: 0 到 255
uint16:表示 16 位无符号整数
大小: 16 位
范围: 0 到 65535
uint32:表示 32 位无符号整数
大小: 32 位
范围: 0 到 4294967295
uint64:表示 64 位无符号整数
大小: 64 位
范围: 0 到 18446744073709551615
uint :表示 32 位或 64 位无符号整数,具体取决于底层平台。
size : 32 位系统中的 32 位和 64 位系统中的 64 位。
范围:在 32 位系统中为 0 到 4294967295,在 64 位系统中为 0 到 18446744073709551615
Floating point types
float32: 32 位浮点数
float64: 64 位浮点数
下面是一个简单的程序来说明整数和浮点类型
1 | package main |
a
和b
的类型是从分配给它们的值推断出来的。在这种情况下a
和b
是类型float64
(float64 是浮点值的默认类型)。我们将a
+b
并分配给变量 sum。我们从a
中减去b
并将其分配给 diff。然后打印总和和差异。用 no1 和 no2 进行类似的计算。上面的程序将打印
1 | type of a float64 b float64 |
Complex types
complex64:具有 float32 实部和虚部
complex128:具有 float64 实部和虚部的复数
内置函数**complex**用于构造具有实部和虚部的复数。复函数有如下定义
1 | func complex(r, i FloatType) ComplexType |
它将实部和虚部作为参数并返回一个complex
type。实部和虚部都必须是同一类型。即float32 或float64。如果实部和虚部都是 float32,则此函数返回类型为 complex64 的复数。如果实部和虚部都是 float64 类型,则此函数返回 complex128 类型的复数值。
复数也可以使用速记语法创建
1 | c := 6 + 7i |
让我们编写一个小程序来理解复数。
1 | package main |
在上述程序中,c1 和 c2 是两个复数。c1 的实部为 5,虚部为 7。c2 具有实部 8 和虚部 27。cadd
分配 c1 和 c2 的和,并cmul
分配 c1 和 c2 的乘积。该程序将输出
1 | sum: (13+34i) |
Other numeric types
byte是 uint8 的别名
rune是 int32 的别名
string type
字符串是 Go 中字节的集合。如果这个定义没有任何意义也没关系。现在,我们可以假设一个字符串是一个字符的集合。
让我们使用字符串编写一个程序。
1 | package main |
在上面的程序中,首先分配了字符串“Naveen”,最后分配了字符串“Ramanathan”。可以使用 + 运算符连接字符串。name被赋值为first连接到一个空格后跟last。上面的程序将My name is Naveen Ramanathan
作为输出打印。
Type Conversion
Go 对显式类型非常严格。没有自动类型提升或转换。让我们通过一个例子来看看这意味着什么。
1 | package main |
上面的代码在 C 语言中是完全合法的。但是在 go 的情况下,这是行不通的。i 是 int 类型,j 是 float64 类型。我们正在尝试添加 2 个不同类型的数字,这是不允许的。当你运行程序时,你会得到./prog.go:10:11: invalid operation: i + j (mismatched types int and float64)
要修复错误,i
和j
应该是相同的类型。让我们将j
转换为 int。T(v)
是将值 v
转换为类型 T
的语法
1 | package main |
现在,当您运行上述程序时,您可以看到122
输出。
赋值也是如此。需要显式类型转换才能将一种类型的变量分配给另一种类型。这在以下程序中进行了解释。
1 | package main |
在第9行,i 被转换为float64然后赋值给 j。当您尝试将 i 分配给 j 而不进行任何类型转换时,编译器将抛出错误。