在Go中,假設我有一個UTF-8的[]byte,我想把它作為一個字串回傳。
func example() *string {
byteArray := someFunction()
text := string(byteArray)
return &text
}
我想取消text變數,但Go不支持以下內容:
func example() *string {
byteArray := someFunction()
return &string(byteArray)
}
這第二個例子的語法是否正確?如果是的話,為什么Go不支持呢?
uj5u.com熱心網友回復:
因為spec的定義是這樣的:
對于型別為T的運算元x,尋址操作&x生成一個型別為*T的指標到x。運算元必須是可尋址的,也就是說,要么是一個變數、指標指示或片狀索引操作;要么是一個可尋址結構運算元的欄位選擇器;要么是一個可尋址陣列的陣列索引操作。作為可尋址要求的一個例外,x也可以是一個(可能是括號內的)復合字面。請注意,型別轉換(你試圖用
string(byteArray)做的事情)不包括在這個串列中。
uj5u.com熱心網友回復:
關于官方的參考,請看Marc的回答,但這里有一個直觀的原因,說明為什么Go不支持這個。
假設以下代碼
var myString string
stringPointer := &myString
*stringPointer = "一些新值"
希望你知道,這段代碼將向myString寫入一些新的值。這就是指標的基本用法。現在考慮修改后的例子(假裝它是有效的代碼):
var myBytes []byte>
//修改myBytes...
stringPointer := &string(myString)
*stringPointer = "一些新的值"。
問題是,在這個世界上(或計算機),我們正在寫到哪里?某個新的值要去哪里?
為了使語言能夠在短時間內完成,我們需要寫一個新的值。
為了使語言能夠正確地處理這個問題,編譯器將需要一些內部流程來將臨時值 "提升 "到一個不可見的變數,然后獲取該變數的地址。這將增加不必要的復雜性,以使某些代碼略更短,但卻造成了這種令人困惑的情況,即我們在程式中沒有明確定義的指標位置。與其創造這些令人困惑的鬼魂變數,不如讓語言授權給程式員,讓他們像往常一樣使用自己的變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313760.html
標籤:
