测试我的代码https://go.dev/play/p/2l9vmvATG4J?v=goprev 代码:
package main
import (
"fmt"
"reflect"
"unsafe"
)
type A struct {
v1 int
}
func (this \*A) Re() float64 {
return float64(this.v1)
}
type B struct {
v2 float64
}
func (this \*B) Re() float64 {
return float64(this.v2)
}
type C interface {
Re() float64
}
func Set(recv C, value C) {
p := (\*C)(unsafe.Pointer(&recv))
\*p = value
fmt.Println(reflect.ValueOf(recv).Elem(), reflect.ValueOf(value).Elem(), reflect.ValueOf(\*p).Elem(), "2")
//return nothing really nothing nothing nothing
}
func Set2(recv C, value C) {
reflect.ValueOf(recv).Elem().Set(reflect.ValueOf(value).Elem())
//return nothing really nothing nothing nothing
}
func main() {
var v1 C = &B{0}
var v2 C = &A{1}
fmt.Println(v1, v2, "1")
Set(v1, v2)
fmt.Println(v1, v2, "3")
Set2(v1, v2)
fmt.Println(v1, v2, "4")
}
控制台输出:
&{0} &{1} 1
{1} {1} {1} 2
&{0} &{1} 3
panic: reflect.Set: value of type main.A is not assignable to type main.B
goroutine 1 [running]:
reflect.Value.assignTo({0x48f540?, 0xc00001c038?, 0x0?}, {0x49b8bd, 0xb}, 0x48f5c0, 0x0)
/usr/local/go-faketime/src/reflect/value.go:3145 +0x2a5
reflect.Value.Set({0x48f5c0?, 0xc00001c030?, 0x497580?}, {0x48f540?, 0xc00001c038?, 0x47d8ee?})
/usr/local/go-faketime/src/reflect/value.go:2160 +0xeb
main.Set2({0x4ba9a8?, 0xc00001c030?}, {0x4ba988?, 0xc00001c038})
/tmp/sandbox1746522097/prog.go:38 +0x1b1
main.main()
/tmp/sandbox1746522097/prog.go:47 +0x1a7
Program exited.
我想将 v1 设置为 v2,这是另一种类型的结构,但两者都被相同类型的接口接受。 Set 和 Set2 不能返回。 我在整个互联网上搜索,找不到任何东西。 请教我。 对不起,如果有任何英语错误,我是巴西人,我 13 岁。
有人帮助了我,这是一个正确的链接:https://go.dev/play/p/gPgqtm3_5TR?v=goprev。 谢谢:@mkopriva