Go语言中不同类型切片之间的相互转换

将 []T 切片转换为 []byte

类似C语言中将其他类型的数组转换为char数组:

func ByteSlice(slice interface{}) (data []byte) {
    sv := reflect.ValueOf(slice)
    if sv.Kind() != reflect.Slice {
        panic(fmt.Sprintf("ByteSlice called with non-slice value of type %T", slice))
    }
    h := (*reflect.SliceHeader)((unsafe.Pointer(&data)))
    h.Cap = sv.Cap() * int(sv.Type().Elem().Size())
    h.Len = sv.Len() * int(sv.Type().Elem().Size())
    h.Data = sv.Pointer()
    return
}

基于该函数,我们可以方便调用 []byte 类型参数的函数:

func SaveImageData(name string, data []color.RGBA) error {
    return ioutil.WriteFile(name, ByteSlice(data), 0666)
}

注意事项

该转换操作有一定的风险,用户需要自己保证安全。主要涉及以下几种类型:

  • 当结构体中含有指针时,转换会导致垃圾回收的问题。
  • 如果是 []byte 转 []T 可能会导致起始地址未对齐的问题 ([]byte 有可能从奇数位置切片)。
  • 该转换操作可能依赖当前系统,不同类型的处理器之间有差异。

该转换操作的优势是性能和类似void*的泛型,与cgo接口配合使用会更加理想。

http://my.oschina.net/chai2010/blog/266864

时间: 2024-10-12 23:57:05

Go语言中不同类型切片之间的相互转换的相关文章

C语言中不同类型的循环(Different types of loops in C)

C语言中有三种类型的循环:for,while,do-while. while循环先判断循环条件. while (condition) { //gets executed after condition is checked } do-while循环先执行循环体重的语句,再判断循环条件. do { //gets executed at least once } while (condition); for循环可以一行中初始化一个计数变量,设置一个判断条件,和计数变量的自增. for (int x

程序猿之---C语言细节26(C语言中布尔类型、continue细节、sizeof举例、strlen举例)

主要内容:C语言中布尔类型.continue细节.sizeof举例.strlen举例 一.布尔类型 可能很多人不知道现在C语言已经有了布尔类型:从C99标准开始,类型名字为"_Bool" 在C99标准之前我们常常自己模仿定义布尔类型,常见有以下几种方式: 1.方式一 #define TURE 1 #define FALSE 0 2.方式二 typedef enum {false, true} bool; 3.方式三 typedef int bool 闲int浪费内存,对内存敏感的程序使

C语言中结构体变量之间赋值

最近,我阅读了某新员工小刘写的C语言代码,发现其对结构体变量之间的赋值不是很熟悉.对于两个相同类型的结构体变量,他均采用的是逐个成员变量直接赋值的形式.如下的代码示例: 如上代码所示,tEmployeeInfoSrc和tEmployeeInfoDest是两个类型相同的结构体变量,tEmployeeInfoSrc(源结构体变量)中的各个成员变量已赋初值.现要使tEmployeeInfoDest(目的结构体变量)中的各个成员变量的值与tEmployeeInfoSrc中对应成员变量的值相同.小刘采用的

C#中String 与Color之间的相互转换

其实,我们平常如果要在数据库存放Color类型值的话,肯定会在数据库中建立varchar类型.对吧.但是Color怎么存才合适呢,当然是要转为String了.这里小宋作个简介吧.其实用法很简单:      这个控件中,最后取得的当然是Color类型的值了.所在转为String只要用转换器就行.   String  color = System.Drawing.ColorTranslator.ToHtml(colorEdit1.Color); //将Color对象转为String对象.如#AABB

VC中CString和WPARAM之间的相互转换

在传递自己定义消息的过程中.须要转换CString 变量. 在发送消息端使用例如以下方法: SendMessage(WM_MESSAG_MINE,0,(LPARAM)strVal.AllocSysString()); ---------------------------------------- 在接收消息端使用: BSTR b = (BSTR)lParam; CString s(b); SysFreeString(b); AfxMessageBox(s);

Swift中NSData与NSDictionary之间的相互转换

原创Blog,转载请注明出处 使用NSKeyedUnarchiver类来进行相互转换 1.NSDictionary转NSData var dictionaryExample : [String:AnyObject] = ["user":"UserName", "pass":"password", "token":"0123456789", "image":0] let

Lua中的类型与值

[基础介绍] Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8中基本类型,分别是: nil(空)类型 boolean(布尔)类型 number(数字)类型 string(字符串)类型 userdata(自定义类型) function(函数)类型 thread(线程)类型 table(表)类型 以上是Lua中的8中基本类型,我们可以使用type函数,判断一个值得类型,type函数返回一个对应类型的字符串描述.例如: local iValue =

C语言中两个相同类型的结构体变量之间是可以相互直接赋值的

C语言中,在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,而两个同类型的结构体变量属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的.所以,在C语言中两个相同类型的结构体变量之间是可以相互赋值的.但是要注意指针的浅层复制问题. 下面是一个简单的验证代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdlib.h> struct test

学习Golang语言(6):类型--切片

学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Golang语言(5):类型--数组 学习Golang语言(6):类型--切片 在很多应用场景中,数组不能够满足我们的需求.在初始定义数组时,我们并不知道数组所需的长度.因此,我们需要一个大小可以动态变化的数组(动态数组) 在Go语言中,这种"动态数组"成为slice(切片). 但是实际上slic