# **復數**
和浮點數相似,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 本章小結