slice类型和sliceheader类型不能互相显式转换吗?

第一种情况:


    sl:=[]int{1,2,3}
psl:=reflect.SliceHeader(sl)
fmt.Println(psl)

报错:
cannot convert expression of type []int to type SliceHeader


第二种情况:


    var psl []int
sl:=[]int{1,2,3}
psl=reflect.SliceHeader(sl)
fmt.Println(psl)

报错:
cannot convert expression of type []int to type SliceHeader
cannot use reflect.SliceHeader(sl) (type SliceHeader) as type []int in assignment


初学go,为什么sliceheader类型和slice类型不能互转?

已邀请:

sheepbao - 爱go,爱编程,专注网络开发,流媒体、分布式、网络加速,欢迎讨论listomebao@gmail.com

赞同来自: ddxx11223

你要的是这个吗?


s := []int{1, 2, 3}
sh := (*reflect.SliceHeader)(unsafe.Pointer(&s))
fmt.Println(*sh)

simple - 分布式 & Java & Go

赞同来自: ddxx11223

仔细试验了一下,发现这是个很有意思的问题。
s := []int{1, 2, 3}
sh := (reflect.SliceHeader)(unsafe.Pointer(&s))
fmt.Println(
sh)
首先可以通过指针正确的装换,所以[]Type和reflect.SliceHeader变量在内存中的布局是一样,那内存布局是一样的为什么不能直接显示转换?
我不能给你很专业的回答,但希望你能看到下面两种的不同:
(1)
type A struct {
a int
}


type B struct {
a int

}


a := A{2}
b := B(a) // OK, 两个结构体里的字段个数,字段排列方式和字段名完全相同
fmt.Println(b)


(2)
type A struct {
m int
}


type B struct {
a int

}


a := A{2}
b := B(a) // Not OK, 内存布局相同,但字段名字(区别大小写)不同


推断:只有两个结构体里的字段个数,字段排列方式和字段名(区别大小写)完全相同,才可以直接显式装换。如果只是内存布局一致(字段个数和字段排列方式相同),只能通过指针的方式转换,[]Type和reflect.SliceHeader就是这种情况。

sheepbao - 爱go,爱编程,专注网络开发,流媒体、分布式、网络加速,欢迎讨论listomebao@gmail.com

赞同来自:

类型不符,当然是不可以互相转化的

要回复问题请先登录注册