文章目录 GO类型转换及与C的类型转换类型转换类型断言其他转换bytes 、string转换interface转为stringstring与unicode字符互转 go和c类型装换

GO类型转换及与C的类型转换 类型转换

语法

dst := float32(src)

示例

var num int = 520f32 := float32(num)i64 := int64(num)

注意:加入val是一个指针,int32(val)相当于*(int32(var1)),指针不能直接转换成一个int32类型,应该改为(*int32)(var1),所以某些类型可能引起误会的应该用括号括起来转换。

类型断言

语法

dst,ok := src.(int) // 安全类型断言,通过ok判断是否转换成功dst := src.(int)  // 非安全类型断言,无法确定是否转换成功

示例

var val interface{} = 123num,ok := val.(int)if ok { fmt.Printf("%T->%d\n", num, num)} else { fmt.Println("类型不匹配")} 其他转换

go提供了strconv包来进行转换

bytes 、string转换 //类型转换 string to bytes func str2bytes(s string) []byte { x := (*[2]uintptr)(unsafe.Pointer(&s)) h := [3]uintptr{x[0], x[1], x[1]} return *(*[]byte)(unsafe.Pointer(&h)) }//类型转换 bytes to string func bytes2str(b []byte) string { return *(*string)(unsafe.Pointer(&b)) } interface转为string //interface转为string func interface2string(inter interface{}) string { tempStr := "" switch inter.(type) { case string: tempStr = inter.(string) break case float64: tempStr = strconv.FormatFloat(inter.(float64), 'f', -1, 64) break case int64: tempStr = strconv.FormatInt(inter.(int64), 10) break case int: tempStr = strconv.Itoa(inter.(int)) break } return tempStr } //整形转字符串strconv.Itoa(100)//该方法的源码是://可以看出是FormatInt方法的简单实现。func Itoa(i int) string { return FormatInt(int64(i), 10)}//字符串转整形i, _ := strconv.Atoi("100")//64位整形转字符串,FormatInt第二个参数表示进制,10表示十进制var i int64i = 0x100strconv.FormatInt(i, 10)//字节转32位整形b := []byte{0x00, 0x00, 0x03, 0xe8}bytesBuffer := bytes.NewBuffer(b)//其中binary.BigEndian表示字节序,相应的还有little endian。通俗的说法叫大端、小端。var x int32binary.Read(bytesBuffer, binary.BigEndian, &x)fmt.Println(x)//32位整形转字节var x int32x = 106bytesBuffer := bytes.NewBuffer([]byte{})binary.Write(bytesBuffer, binary.BigEndian, x)fmt.Println(bytesBuffer.Bytes())//字节转字符串fmt.Println(string([]byte{97, 98, 99, 100}))//字符串转字节fmt.Println([]byte("abcd")) string与unicode字符互转 //string-->unicodefunc Str2uft16ptr(str string)(p uintptr){//将字符串转为utf16指针e:=utf16.Encode([]rune(str))//转成unicodee=append(e, uint16(0))//添加末尾的0p=uintptr(unsafe.Pointer(&e[0]))//转成指针//p=uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str)))return}//unicode-->stringfunc addbuf(buf []uint16,newcap int)(newbuf []uint16){newbuf=make([]uint16,newcap)copy(newbuf,buf)return}func Utf16prt2str(p uintptr)(str string){//将utf16指针转为字符串len:=0buf:=make([]uint16,64)for a:=(*(*uint16)(unsafe.Pointer(p)));a!=0;len++{if len>=cap(buf){buf=addbuf(buf,len*2)}buf[len]=ap+=2//uint16占2字节a=(*(*uint16)(unsafe.Pointer(p)))}str=string(utf16.Decode(buf[:len]))return} go和c类型装换 #cgochar --> C.char --> bytesigned char --> C.schar --> int8unsigned char --> C.uchar --> uint8short int --> C.short --> int16short unsigned int --> C.ushort --> uint16int --> C.int --> intunsigned int --> C.uint --> uint32long int --> C.long --> int32 or int64long unsigned int --> C.ulong --> uint32 or uint64long long int --> C.longlong --> int64long long unsigned int --> C.ulonglong --> uint64float --> C.float --> float32double --> C.double --> float64wchar_t --> C.wchar_t --> void * -> unsafe.Pointer#windowuint64 //对应SIZE_Tuint32 //对应DWORD //整型数//Go->C:var i intci := C.int(i)//C->Go:var i C.intgoi := int(i)//数组和字符串//Go->C:var str stringcstr := C.CString(str)//C->Go:/*#include <stdlib.h>#include <stdio.h>char foo[] = "hellofoo";char *bar = "hellobar";*/import "C"import "fmt"func main() { fmt.Printf("%s\n", C.GoString(&C.foo[0])) fmt.Printf("%s\n", C.GoString(C.bar))}//数组类型转换/*#include <stdio.h>int cIArray[] = {1, 2, 3, 4, 5, 6, 7}; //intfloat cFArray[] = {1.011, 2.022, 3.022, 4.023, 5.02, 6.03, 7.045};//float*/import "C"import "fmt"func main() { goIArray := C.cIArray[:] fmt.Println(goIArray) goFArray := C.cFArray[:] fmt.Println(goFArray)}//[]byte 转换为 *charc_char := (*C.char)(unsafe.Pointer(&bt[0]))

fmt格式字符串:

打印格式含义%%一个%字面量%b一个二进制整数值(基数为2),或者是一个(高级的)用科学计数法表示的指数为2的浮点数%c字符型。可以把输入的数字按照ASCII码相应转换为对应的字符%d一个十进制数值(基数为10)%e以科学记数法e表示的浮点数或者复数值%E以科学记数法E表示的浮点数或者复数值%f以标准记数法表示的浮点数或者复数值%g以%e或者%f表示的浮点数或者复数,任何一个都以最为紧凑的方式输出%G以%E或者%f表示的浮点数或者复数,任何一个都以最为紧凑的方式输出%o一个以八进制表示的数字(基数为8)%p以十六进制(基数为16)表示的一个值的地址,前缀为0x,字母使用小写的a-f表示%q使用Go语法以及必须时使用转义,以双引号括起来的字符串或者字节切片[]byte,或者是以单引号括起来的数字%s字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0‘结尾,这个’\0’即空字符)%t以true或者false输出的布尔值%T使用Go语法输出的值的类型%U一个用Unicode表示法表示的整型码点,默认值为4个数字字符%v使用默认格式输出的内置或者自定义类型的值,或者是使用其类型的String()方式输出的自定义值,如果该方法存在的话%x以十六进制表示的整型值(基数为十六),数字a-f使用小写表示%X以十六进制表示的整型值(基数为十六),数字A-F使用小写表示 强制转换隐式转换类型断言类型之间可以不可以可以类型->接口可以可以可以接口->类型不可以不可以可以接口之间可以(编译期间确定)可以(编译期间确定)可以