出于測試目的,我嘗試模擬庫中的Rows.Scan方法database/sql。簽名看起來像這樣:func?(r?*Rows)?Scan(dest?...interface{})?error許多如何使用此方法的示例表明,您將一個指向字符串(例如)的指針傳遞給 Scan 方法,它將通過該指針分配值。var?name?stringrows.Scan(&name)我一直在嘗試重新創建類似的東西以實現我自己的理解并最終進行嘲笑,但它不起作用。func?MockScan(args?...interface{})?{
????var?s2?string
????fmt.Println(args[0])
????args[0]?=?&s2
????fmt.Println(args[0])
}
func?main()?{
????var?s1?string
????fmt.Println(&s1)
????MockScan(&s1)
????fmt.Println(&s1)
}結果是:0xc0000129500xc0000129500xc0000129600xc000012950我的初始字符串永遠不會呈現新值。我知道字符串是不可變的(盡管我對這個概念的真正理解有點動搖),但實際的Rows.Scan方法不知何故設法改變了字符串。
1 回答

ITMISS
TA貢獻1871條經驗 獲得超8個贊
args[0] = &s2
這在 之外沒有任何作用MockScan。您正在更改args[0]指向的內容,而不是更改指向的內容args[0]。
你想做類似的事情
func MockScan(args ...interface{}) {
// In real life, there would be some logic here to figure out what
// kind of pointer we're dealing with, or some error handling to
// handle the case where the user didn't pass a *string
dst := args[0].(*string)
*dst = "A new value"
}
func main() {
var s1 string = "An old value"
fmt.Println(s1)
MockScan(&s1)
fmt.Println(s1)
}
請注意,如果我們在&s1調用之前和之后在 main 中打印,它仍然不會改變。它仍然是相同的變量,仍然位于相同的地址。我們已將一個指針傳遞&s1給MockScan,以便MockScan可以使用該指針將值寫入s1。
- 1 回答
- 0 關注
- 106 瀏覽
添加回答
舉報
0/150
提交
取消