go string記憶體結構

2022-03-12 14:48:06 字數 2171 閱讀 6179

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當前程...