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 - https://sheepbao.github.io 爱go,爱编程,领域网络开发,流媒体、分布式、网络加速

赞同来自: ddxx11223

你要的是这个吗?

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

simple - 既要有梦想,又要有实力

赞同来自: 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 - https://sheepbao.github.io 爱go,爱编程,领域网络开发,流媒体、分布式、网络加速

赞同来自:

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

要回复问题请先登录注册