golang 原始碼分析之string

2021-10-25 10:28:03 字數 1708 閱讀 9445

string

go 語言中的字串其實是乙個唯讀的位元組陣列
string 對應的結構

type stringheader struct

type stringstruct struct

字串拼接

concatstrings:runtime/concatstrings

func

concatstrings

(buf *tmpbuf, a [

]string

)string

if l+n < l

l += n

count++

idx = i

}if count ==

0// 如果非空字串的數量為 1 並且當前的字串不在棧上就可以直接返回該字串,不需要進行額外的任何操作

if count ==1&&

(buf !=

nil||

!stringdataonstack

(a[idx]))

// 申請新的記憶體

s, b :=

rawstringtmp

(buf, l)

// 多個字串拷貝到目標字串所在的記憶體空間中

for_

, x :=

range a

return s

}

位元組陣列到字串的轉換

slicebytetostring:runtime/slicebytetostring

func

slicebytetostring

(buf *tmpbuf, ptr *

byte

, n int

)(str string

)// 長度為1 也特殊處理

if n ==

1stringstructof

(&str)

.str = p

stringstructof

(&str)

.len=1

return

}var p unsafe.pointer

// 如果入參的緩衝區夠用

if buf !=

nil&& n <=

len(buf)

else

// 複製

stringstructof

(&str)

.str = p

stringstructof

(&str)

.len

= n // 移動

memmove

(p, unsafe.

pointer

(ptr)

,uintptr

(n))

return

}

字串轉位元組陣列

stringtoslicebyte:runtime/stringtoslicebyte

func

stringtoslicebyte

(buf *tmpbuf, s string)[

]byte

b = buf[

:len

(s)]

}else

copy

(b, s)

return b

}

golang 原始碼分析之context

context 上下文 context.context 是用來設定截止日期 同步訊號,傳遞請求相關值的結構體。該介面定義了四個需要實現的方法 deadline 返回 context.context 被取消的時間,也就是完成工作的截止日期 done 返回乙個 channel,這個 channel 會在...

《Python原始碼剖析》之 str

定義 typedef struct pystringobject 說明 pyobject var head pystringobject是變長物件,比定長物件多了乙個ob size欄位 ob shash 儲存字串的hash值,如果還沒計算等於 1 當string hash被呼叫,計算結果會被儲存到這...

golang初探與命令原始碼分析

前段時間有群友在群裡問乙個go語言的問題 就是有乙個main.go的main函式裡呼叫了另乙個demo.go裡的hello 函式。其中main.go和hello.go同屬於main包。但是在main.go的目錄下執行go run main.go卻報hello函式沒有定義的錯 結構如下 gopath ...