go string 實現原理剖析(你真的了解string嗎)
//builtin包對string的描述
// string is the set of all strings of 8-bit bytes, conventionally but not
// necessarily representing utf-8-encoded text.
//a string may be empty, but not nil.
//values of string type are immutable.
type string string
- 預設零值是"" , 而不是nil
- 不可變(值儲存在唯讀記憶體區)
- stings資料結構的定義:
src/runtime/string.go: stringstruct (對外呈現string)
type stringstruct struct
// str構造過程: 先構造stringstruct,然後將stringstruct轉為str返回
var s string
s = "mao"
func gostringnocopy(str *byte) string // 先構造stringstruct
s := *(*string)(unsafe.pointer(&ss)) // 再將stringstruct轉換成string
return s
}
// byte轉string(轉換需要一次記憶體拷貝)
func getstringbyslice(s byte) string
1. 根據切片長度申請足夠記憶體位址空間
2. 構建string
3. 拷貝資料
// string轉換byte(轉換需要一次記憶體拷貝)
func getslicebystring(str string) byte
1.申請記憶體位址空間
2.拷貝資料
// 字串拼接
str := "str1" + "str2" + "str3"
效能較好:
新字串的記憶體空間是一次分配完成的,
所以效能消耗主要在拷貝資料上。
乙個拼接語句的字串編譯時都會被存放到乙個切片中,拼接過程需要遍歷兩次切片,
1. 第一次遍歷獲取總的字串長度,據此申請記憶體,
2. 第二次遍歷會把字串逐個拷貝過去。
func concatstrings(a string) string
s, b := rawstring(length) // 生成指定大小的字串,返回乙個string和切片,二者共享記憶體空間
for _, str := range a
return s
}func rawstring(size int) (s string, b byte)
return
}
// 為什麼字串不允許修改?
像c++語言中的string,其本身擁有記憶體空間,修改string是支援的。
但go的實現中,string**不包含記憶體空間,只有乙個記憶體的指標**,
這樣做的好處是string變得非常輕量,可以很方便的進行傳遞而不用擔心記憶體拷貝。
因為string通常指向字串字面量,**而字串字面量儲存位置是唯讀段,而不是堆或棧上,**
所以才有了string不可修改的約定。
[strings包][
toupper
replace
index
hashstr //use in rabin-karp algorithm.
indexrabinkarp
gensplit
countgeneric
rabin-karp 演算法(字串快速查詢) go string與time標準包使用簡介
go語言的標準庫覆蓋網路 系統 加密 編碼 圖形等各個方面,可以直接使用標準庫的 http 包進行 http 協議的收發處理 網路庫基於高效能的作業系統通訊模型 linux 的 epoll windows 的 iocp 所有的加密 編碼都內建支援,不需要再從第三方開發者處獲取 go 語言的編譯器也是...
mysql記憶體結構 MySQL記憶體結構
實際上mysql記憶體的組成和oracle類似,也可以分為sga 系統全域性區 和pga 程式快取區 mysql show variables like buffer 一 sga 1.innodb buffer bool 用來快取innodb表的資料 索引 插入緩衝 資料字典等資訊。2.innodb...
記憶體結構 堆結構及記憶體分配函式
linux對記憶體結構的描述 1 在linux中,目錄 proc 下存放著相應程序執行時的所有訊號,其它maps中包含對該程序的記憶體分配信資訊,在命令列下執行maps即可檢視 必須是當前執行中的程序,程序結束時,對應目錄自動銷毀 補 ps aue 檢視有效程序 a所有使用者 u當前使用者 d當前程...