## 4.6\. 類型簡介
Go語言中有一些通用的類型,例如"int"和"float",它們對應的內存大小和處理器類型相關。同時, 也包含了許多固定大小的類型,例如"int8"和"float64",還有無符號類型"uint"和"uint32"等。 需要注意的是,即使"int"和"int32"占有同樣的內存大小,但并不是同一種數據類型。不過 "byte"和"uint8"對應是相同的數據類型,它們是字符串中字符類型。
go中的字符串是一個內建數據類型。字符串雖然是字符序列,但并不是一個字符數組。可以創建新的 字符串,但是不能改變字符串。不過我們可以通過新的字符串來達到想改變字符串的目的。 下面列舉"strings.go"例子說明字符串的常見用法:
```
11 s := "hello"
12 if s[1] != 'e' { os.Exit(1) }
13 s = "good bye"
14 var p *string = &s
15 *p = "ciao"
```
不管如何,試圖修改字符串的做法都是被禁止的:
```
s[0] = 'x';
(*p)[1] = 'y';
```
Go中的字符串和C++中的"const strings"概念類似,字符串指針則相當于C++中的"const strings" 引用。
是的,它們都是指針,但是Go中用法更簡單一些。
數組的聲明如下:
```
var arrayOfInt [10]int;
```
數組和字符串一樣也是一個值對象,不過數組的元素是可以修改的。不同于C語言的是:"int"類型數組 "arrayOfInt"并不能轉化為"int"指針。因為,在Go語言中數組是一個值對象,它在內部保存"int"指針。
數組的大小是數組類型的一部分。我們還可以通過slice(切片)類型的變量來訪問數組。 首先,數據元素的類型要和slice(切片)類型相同,然后通過"a: high?"類似的 語法來關聯數組的low到heigh-1的子區間元素。Slices和數組的聲明語法類似,但是不像數組那樣 要指定元素的個數(""和"10?"的區別);它在內部引用特定的空間,或者其它數組的空間。 如果多個Slices引用同一個數組,則可以共享數組的空間。但是不同數組之間是無法共享內存空間的。
在Go語言中Slices比數組使用的更為普遍,因為它更有彈性,引用的語法也使得它效率很高。 但是,Slices缺少對內存的絕對控制比數組要差一些。例如你只是想要一個可以存放100個元素 的空間,那么你就可以選擇數組了。創建數組:
```
[3]int{1,2,3}
```
上面的語句創建一個含有3個元素的int數組。
當需要傳遞一個數組給函數時,你應該將函數的參數定義為一個Slice。這樣,在調用函數的時候, 數組將被自動轉換為slice傳入。
比如以下函數以slices類型為參數(來自"sum.go"):
```
09 func sum(a []int) int { // returns an int
10 s := 0
11 for i := 0; i < len(a); i++ {
12 s += a[i]
13 }
14 return s
15 }
```
函數的返回值類型(int)在sum()函數的參數列表后面定義。
為了調用sum函數,我們需要一個slice作為參數。我們先創建一個數組,然后將數組轉為slice類型:
```
s := sum([3]int{1,2,3}[:])
```
如果你創建一個初始化的數組,你可以讓編譯器自動計算數組的元素數目,只要在數組大小中填寫"..."就 可以了:
```
s := sum([...]int{1,2,3}[:])
```
是實際編碼中,如果不關心內存的具體細節,可以用slice類型(省略數組的大小)來代替數組地址為函數參數:
```
s := sum([]int{1,2,3});
```
還有map類型,可以用以下代碼初始化:
```
m := map[string]int{"one":1 , "two":2}
```
用內建的"len()"函數,可以獲取map中元素的數目,該函數在前面的"sum"中用到過。"len()"函數 還可以用在strings, arrays, slices, maps, 和 channels 中。
還有另外的"range"語法可以用到strings, arrays, slices, maps, 和 channels 中, 它可以用于"for"循環的迭代。例如以下代碼
```
for i := 0; i < len(a); i++ { ... }
```
用"range"語法可以寫成:
```
for i, v := range a { ... }
```
這里的"i"對應元素的索引,"v"對應元素的值。關于更多的細節可以參考 Effective Go。
- 1. 關于本文
- 2. Go語言簡介
- 3. 安裝go環境
- 3.1. 簡介
- 3.2. 安裝C語言工具
- 3.3. 安裝Mercurial
- 3.4. 獲取代碼
- 3.5. 安裝Go
- 3.6. 編寫程序
- 3.7. 進一步學習
- 3.8. 更新go到新版本
- 3.9. 社區資源
- 3.10. 環境變量
- 4. Go語言入門
- 4.1. 簡介
- 4.2. Hello,世界
- 4.3. 分號(Semicolons)
- 4.4. 編譯
- 4.5. Echo
- 4.6. 類型簡介
- 4.7. 申請內存
- 4.8. 常量
- 4.9. I/O包
- 4.10. Rotting cats
- 4.11. Sorting
- 4.12. 打印輸出
- 4.13. 生成素數
- 4.14. Multiplexing
- 5. Effective Go
- 5.1. 簡介
- 5.2. 格式化
- 5.3. 注釋
- 5.4. 命名
- 5.5. 分號
- 5.6. 控制流
- 5.7. 函數
- 5.8. 數據
- 5.9. 初始化
- 5.10. 方法
- 5.11. 接口和其他類型
- 5.12. 內置
- 5.13. 并發
- 5.14. 錯誤處理
- 5.15. Web服務器
- 6. 如何編寫Go程序
- 6.1. 簡介
- 6.2. 社區資源
- 6.3. 新建一個包
- 6.4. 測試
- 6.5. 一個帶測試的演示包
- 7. Codelab: 編寫Web程序
- 7.1. 簡介
- 7.2. 開始
- 7.3. 數據結構
- 7.4. 使用http包
- 7.5. 基于http提供wiki頁面
- 7.6. 編輯頁面
- 7.7. template包
- 7.8. 處理不存在的頁面
- 7.9. 儲存頁面
- 7.10. 錯誤處理
- 7.11. 模板緩存
- 7.12. 驗證
- 7.13. 函數文本和閉包
- 7.14. 試試!
- 7.15. 其他任務
- 8. 針對C++程序員指南
- 8.1. 概念差異
- 8.2. 語法
- 8.3. 常量
- 8.4. Slices(切片)
- 8.5. 構造值對象
- 8.6. Interfaces(接口)
- 8.7. Goroutines
- 8.8. Channels(管道)
- 9. 內存模型
- 9.1. 簡介
- 9.2. Happens Before
- 9.3. 同步(Synchronization)
- 9.4. 錯誤的同步方式
- 10. 附錄
- 10.1. 命令行工具
- 10.2. 視頻和講座
- 10.3. Release History
- 10.4. Go Roadmap
- 10.5. 相關資源