# **复数**
和浮点数相似,Go提供了两种复数类型:`complex64`和`complex128`。第一个使用两个32位浮点数:一个用于实部,另一个用于复数的虚部,而`complex128`使用两个64位浮点数。复数以`a + bi`的形式表示,其中 `a`和 `b` 是实数,i 是方程 $x^2 =−1$ 的解。
所有这些数字数据类型都在`numbers.go`中分为三个部分进行说明。
第一部分的代码如下:
```Go
package main
import (
"fmt"
)
func main() {
c1 := 12 + 1i
c2 := complex(5, 7)
fmt.Printf("Type of c1: %T\n", c1)
fmt.Printf("Type of c2: %T\n", c2)
var c3 complex64 = complex64(c1 + c2)
fmt.Println("c3:", c3)
fmt.Printf("Type of c3: %T\n", c3)
cZero := c3 - c3
fmt.Println("cZero:", cZero)
```
这部分使用了一些复数进行计算。有两种方法去创建复数:与`c1`和`c2`一样直接创建, 或间接地通过计算现有的复数得到,例如`c3`和`cZero`。
>Tip: 如果你错误地尝试将一个复数创建为 `aComplex:= 12 + 2 * i`,那么将会有两种可能的结果,因为这个语句告诉Go你想要执行一个加法和一个乘法。如果当前作用域中没有名为i的数值变量,该语句会出现语法错误,你的Go代码编译将失败。但是,如果已经定义了一个名为i的数值变量,那么计算将会成功,但是你将不会得到 需的复数(**bug**)。
第二部分代码如下:
```Go
x := 12
k := 5
fmt.Println(x)
fmt.Printf("Type of x: %T\n", x)
div := x / k
fmt.Println("div", div)
```
在这一部分中,我们使用带符号的整数。请注意,如果你想对两个整数做除法,Go认为你想得到整数答案并将计算返回整数除法的**商**。11除以2得到的是整数5而不是5.5。
>Tip: 当你将浮点数转换为整数时,浮点数的分数将被丢弃且被截断为零,这意味着一些数据可能会在处理过程中丢失。
最后一部分代码:
```GO
var m, n float64
m = 1.223
fmt.Println("m, n:", m, n)
y := 4 / 2.3
fmt.Println("y:", y)
divFloat := float64(x) / float64(k)
fmt.Println("divFloat", divFloat)
fmt.Printf("Type of divFloat: %T\n", divFloat)
}
```
在程序的最后一部分中,我们将使用浮点数。在做除法时, 你可以看到如何使用```float64()```来告诉Go去创建一个```floating-point number```。如果你只是使用 ```divFloat: = float64 (x) / k```, 然后运行代码时你会得到以下错误消息:
```bash
$ go run numbers.go
# command-line-arguments
./numbers.go:35:25: invalid operation:
float64(x) / k (mismatched types float64 and int)
```
执行 ```numbers.go```,结果输出如下:
```bash
Type of c1: complex128
Type of c2: complex128
c3: (17+8i)
Type of c3: complex64
cZero: (0+0i)
12
Type of x: int
div 2
m, n: 1.223 0
y: 1.7391304347826086
divFloat 2.4
Type of divFloat: float64
```
- 介绍
- 1 Go与操作系统
- 01.1 Go的历史
- 01.2 Go的未来
- 01.3 Go的优点
- 01.3.1 Go是完美的么
- 01.3.2 什么是预处理器
- 01.3.3 godoc
- 01.4 编译Go代码
- 2 理解 Go 的内部构造
- Go 编译器
- Go 的垃圾回收
- 三色算法
- 有关 Go 垃圾收集器操作的更多信息
- Maps, silces 与 Go 垃圾回收器
- Unsafe code
- 有关 unsafe 包
- 另一个 usafe 包的例子
- 从 Go 调用 C 代码
- 在同一文件用 Go 调用 C 代码
- 在单独的文件用 Go 调用 C 代码
- 从 C 调用 Go 代码
- Go 包
- C 代码
- defer 关键字
- 用 defer 打印日志
- Panic 和 Recover
- 单独使用 Panic 函数
- 两个好用的 UNIX 工具
- strace
- dtrace
- 配置 Go 开发环境
- go env 命令
- Go 汇编器
- 节点树
- 进一步了解 Go 构建
- 创建 WebAssembly 代码
- 对 Webassembly 的简单介绍
- 为什么 WebAssembly 很重要
- Go 与 WebAssembly
- 示例
- 使用创建好的 WebAssembly 代码
- Go 编码风格建议
- 练习和相关链接
- 本章小结
- 3 Go基本数据类型
- 03.1 Go循环
- 03.1.1 for循环
- 03.1.2 while循环
- 03.1.3 range关键字
- 03.1.4 for循环代码示例
- 03.3 Go切片
- 03.3.1 切片基本操作
- 03.3.2 切片的扩容
- 03.3.3 字节切片
- 03.3.4 copy()函数
- 03.3.5 多维切片
- 03.3.6 使用切片的代码示例
- 03.3.7 使用sort.Slice()排序
- 03.4 Go 映射(map)
- 03.4.1 Map值为nil的坑
- 03.4.2 何时该使用Map?
- 03.5 Go 常量
- 03.5.1 常量生成器:iota
- 03.6 Go 指针
- 03.7 时间与日期的处理技巧
- 03.7.1 解析时间
- 03.7.2 解析时间的代码示例
- 03.7.3 解析日期
- 03.7.4 解析日期的代码示例
- 03.7.5 格式化时间与日期
- 03.8 延伸阅读
- 03.9 练习
- 03.10 本章小结
- 9 并发-Goroutines,Channel和Pipeline
- 09.1 关于进程,线程和Go协程
- 09.1.1 Go调度器
- 09.1.2 并发与并行
- 09.2 Goroutines
- 09.2.1 创建一个Goroutine
- 09.2.2 创建多个Goroutine
- 09.3 优雅地结束goroutines
- 09.3.1 当Add()和Done()的数量不匹配时会发生什么?
- 09.4 Channel(通道)
- 09.4.1 通道的写入
- 09.4.2 从通道接收数据
- 09.4.3 通道作为函数参数传递
- 09.5 管道
- 09.6 延展阅读
- 09.7 练习
- 09.8 本章小结