gpt4 book ai didi

go - "cast"Go中的指针类型如何匹配指向值的类型?

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:23 24 4
gpt4 key购买 nike

我有一个包含不同变量类型的 slice 。一些字符串、整数等。我有什么办法可以将指向这些值之一的指针从 *interface{} 转换为 *string *int32 在适当的地方。

这是一个演示问题的玩具程序:http://play.golang.org/p/J3zgrYyXPq

// Store a string in the slice
valSlice := make([]interface{}, 1)
var strVal string = "test"
valSlice[0] = strVal

// Create a pointer to that string
ptrToStr := &valSlice[0]

// Outputs "string vs *interface {}"
fmt.Printf("%T vs %T\n", valSlice[0], ptrToStr)

// Attempt 1 (doesn't compile):
// ----------------------------
// How can I cast the pointer type to (*string), referencing the same
// memory location as strVal?
// This doesn't compile:
//var castPtr *string = &valSlice[0].(string)

// Attempt 2 (after assertion, doesn't point to the same memory location):
var sureType string = valSlice[0].(string)
var castPtr *string = &sureType
*castPtr = "UPDATED"
fmt.Println(valSlice[0]) // Outputs "test", not "UPDATED"

如果我需要证明我这样做的愿望是合理的,这里是解释。 database/sql 包在扫描值时查看指针类型。我的代码已经准备好一个包含正确类型的零值变量的 slice 以匹配结果集。

因为 Scan 需要指针,所以我遍历我的 slice 并构建一个新的指针 slice ,指向我原始 slice 中的变量。然后,我将这段指针传递给 Scan。但是因为如上所述创建指针的行为导致 *interface{} 指针而不是与变量类型匹配的指针,所以 Scan 不知道底层数据类型将原始 []byte 值转换为。

最佳答案

1 你必须知道,当一个变量被分配给一个接口(interface)时,会发生什么?

str := "hello world"
var tmp interface{} = str

编译器将创建一个临时对象,它与 str 具有相同的值,并且 tmp 与之相关联。所以在那之后,你对 tmp 所做的一切都与 str 无关。 But go does not allow you to change the tempotary object.如果您想了解有关interface 实现的更多信息,请阅读http://research.swtch.com/interfaces

2 如果要更改原始对象,将指针传递给接口(interface)

valSlice := make([]interface{}, 1)
var strVal string = "test"
valSlice[0] = &strVal //pass a pointer to a interafce
var castPtr *string = valSlice[0].(*string) // get the pointer
*castPtr = "UPDATED"//change the string strVal
fmt.Println(strVal) // Outputs "UPDATE"

关于go - "cast"Go中的指针类型如何匹配指向值的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25859199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com