## 字符串
一個字符串是一個不可改變的字節序列。字符串可以包含任意的數據,包括byte值0,但是通常是用來包含人類可讀的文本。文本字符串通常被解釋為采用UTF8編碼的Unicode碼點(rune)序列,我們稍后會詳細討論這個問題。
內置的len函數可以返回一個字符串中的字節數目(不是rune字符數目),索引操作s\[i\]返回第i個字節的字節值,i必須滿足0 ≤ i< len(s)條件約束。
第i個字節并不一定是字符串的第i個字符,因為對于非ASCII字符的UTF8編碼會要兩個或多個字節。我們先簡單說下字符的工作方式。
## 字符串不可修改
字符串的值是不可變的:一個字符串包含的字節序列永遠不會被改變,當然我們也可以給一個字符串變量分配一個新字符串值。
因為字符串是不可修改的,因此嘗試修改字符串內部數據的操作也是被禁止的:
~~~
s[0] = 'L' // compile error: cannot assign to s[0]
~~~
## unicode
在golang中一個中文是一個unicode碼點,一個英文也是一個unicode碼點, unicode長這樣 : `U+6211`.
我們用[]rune("你好")打印出來的數字是經過utf-8編碼過的.

## utf-8
UTF8是一個將Unicode碼點編碼為字節序列的變長編碼。因為unicode是固定的32個位,也就是4個字節來表示,這樣就很浪費. 所有當不足4個字節的時候,使用UTF-8來進行編碼,就會節省空間. 在go語言中,已經使用了UTF-8進行編碼過了.
## 獲取字符串長度
```
utf8.RuneCountInString(s) //使用此方法可以獲取字符串的長度
```
## 字符串和Byte切片
標準庫中有四個包對字符串處理尤為重要:bytes、strings、strconv和unicode包。strings包提供了許多如字符串的查詢、替換、比較、截斷、拆分和合并等功能。
這面這個解釋給出了,為什么要使用byte類型來處理字符串,因為字符串是不可變的.那么每次修改字符串,都會創建一個新的字符串,必然有大量的消耗.而使用byte的切片就可以減少這方面的消耗了.
**bytes包也提供了很多類似功能的函數,但是針對和字符串有著相同結構的\[\]byte類型。因為字符串是只讀的,因此逐步構建字符串會導致很多分配和復制。在這種情況下,使用bytes.Buffer類型將會更有效**。
- 基本語法
- 申明變量
- 常量
- 數據類型
- 強制類型轉換
- 獲取命令行參數
- 指針
- 概述
- new函數
- 函數
- 概述
- 不定參數類型
- 有返回值
- 函數類型
- 回調函數
- 匿名函數和閉包
- 延遲調用defer
- 工程管理
- 工作區
- src,pkg和bin目錄
- 復合類型
- 概述
- 數組
- 概述
- 聲明并初始化
- 拷貝傳值
- slice
- 概述
- 創建切片
- 切片截取
- 切片和底層數組的關系
- slice常用方法
- 切片做函數參數
- map
- 概述
- map操作
- 結構體
- 概述
- 結構體初始化
- 結構體比較
- 結構體作為函數參數
- 結構體前加&
- 面向對象
- 概述
- 匿名組合
- 方法
- 值語義和引用語義
- 方法集
- 方法的繼承
- 方法重寫
- 方法值
- 接口
- 接口定義和實現
- 多態的表現
- 接口繼承
- 接口轉換
- 空接口
- 類型斷言
- 異常處理
- error接口
- panic
- recover
- 文本文件處理
- 字符串操作
- 正則表達式
- json處理
- 文件操作
- 標準設備文件操作
- 并發編程
- 概述
- 并發和并行
- go語言并發優勢
- goroutine
- goroutine概述
- 創建goroutine
- 主協程先退出
- runtime包
- Gosched
- Goexit
- GOMAXPROCE
- channel
- 多資源競爭
- channel類型
- 無緩沖channel
- 有緩沖channel
- 關閉channel
- 單向channel
- 單向channel特性
- 定時器
- Timer
- Ticker
- select
- select作用
- 超時
- sync
- 競爭狀態
- 網絡編程
- 網絡概述
- 網絡協議
- 分層模型
- 網絡分層架構
- 層與協議
- 每層協議的功能
- 鏈路層
- 網絡層
- 傳輸層
- 應用層
- socket編程
- 組合和繼承
- 注意事項
- 細節
- go語言實現隊列
- google工程師golang
- 基礎語法
- 內建容器
- 面向"對象"
- 依賴管理
- 面向接口
- 函數式編程
- 錯誤處理和資源管理
- 測試與性能調優
- goroutine
- channel
- golang問題集
- 斷言和類型轉換
- Go語言圣經
- 入門
- 程序結構
- 命名
- 聲明
- 變量
- 賦值
- 類型
- 包和文件
- 作用域
- 基礎數據類型
- 整數
- 浮點數
- 復數
- 布爾型
- 字符串
- 常量
- 復合數據類型
- 數組
- slice
- map
- 結構體
- json
- 文本和HTML模板
- 函數
- 函數聲明
- 錯誤
- 函數值
- 匿名函數
- defer
- panic
- recover
- 方法
- 方法聲明
- 指針對象的方法
- 封裝
- 接口
- 說明
- 接口是合約
- 實現接口的條件
- 接口值
- 類型斷言
- 通過類型斷言詢問行為
- 類型開關
- Goroutines和Channels
- 協程
- channels
- 無緩沖channel
- 串聯的channel
- 有緩沖channel
- 并發的循環
- select多路復用
- 并發的退出
- 并發問題的自我思考
- 基于共享變量的并發
- 競爭條件
- 互斥鎖
- 讀寫鎖
- 內存同步
- sync.Once
- 協程和線程
- 包和工具
- 測試
- 反射
- 什么是反射
- 為什么需要反射
- reflect.Type和reflect.Value
- 通過reflect.Value修改值
- 底層編程