Go 中列印bytes.Buffer 的不同行為
在Go 中,列印bytes.Buffer 類型的值的行為取決於無論是指標還是非指標值。
考慮以下程式碼範例:
buf := new(bytes.Buffer) buf.WriteString("Hello world") fmt.Println(buf)
在這種情況下,使用 * 運算子取消引用緩衝區指標會呼叫 bytes.Buffer 類型的 String() 方法。此方法傳回緩衝區內容的字串表示形式,從而列印「Hello World」。
現在,讓我們如下修改程式碼:
var buf bytes.Buffer buf.WriteString("Hello world") fmt.Println(buf)
不使用 * 運算符,我們正在傳遞 bytes.Buffer 類型的非指標值。與前面的範例不同,fmt 套件在這種情況下不會呼叫 String() 方法。相反,它使用預設格式將緩衝區列印為結構值:
{[72 101 108 108 111 32 119 111 114 108 100] 0 [72 101 108 108 111 32 119 111 114 108 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0}
此輸出表示 bytes.Buffer 的內部結構,包括支援緩衝區的切片以及長度和容量欄位。
這兩個範例之間的主要差異在於 String() 方法。當列印 *bytes.Buffer 類型的值時,fmt 套件利用 String() 方法來取得緩衝區內容的字串表示形式。由於 bytes.Buffer 類型的非指標值沒有此方法,因此採用預設的結構體格式。
以上是為什麼在 Go 中列印「bytes.Buffer」會根據它是否是指標而產生不同的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!