GO类型转换及与C的类型转换 类型转换 语法
示例
1 2 3 var num int = 520 f32 := float32 (num) i64 := int64 (num)
注意:加入 val
是一个指针, int32(val)
相当于*(int32(var1))
,指针不能直接转换成一个int32类型,应该改为 (*int32)(var1)
,所以某些类型可能引起误会的应该用括号括起来转换。
类型断言 语法
1 2 dst,ok := src.(int ) dst := src.(int )
示例
1 2 3 4 5 6 7 8 var val interface {} = 123 num,ok := val.(int ) if ok { fmt.Printf("%T->%d\n" , num, num) } else { fmt.Println("类型不匹配" ) }
其他转换 go提供了 strconv
包来进行转换
bytes 、string转换 1 2 3 4 5 6 7 8 9 10 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)) } func bytes2str (b []byte ) string { return *(*string )(unsafe.Pointer(&b)) }
interface转为string 1 2 3 4 5 6 7 8 9 10 11 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 }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 strconv.Itoa(100 ) func Itoa (i int ) string { return FormatInt(int64 (i), 10 ) } i, _ := strconv.Atoi("100" ) var i int64 i = 0x100 strconv.FormatInt(i, 10 ) b := []byte {0x00 , 0x00 , 0x03 , 0xe8 } bytesBuffer := bytes.NewBuffer(b) var x int32 binary.Read(bytesBuffer, binary.BigEndian, &x) fmt.Println(x) var x int32 x = 106 bytesBuffer := 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字符互转 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 func Str2uft16ptr (str string ) (p uintptr ){ e:=utf16.Encode([]rune (str)) e=append (e, uint16 (0 )) p=uintptr (unsafe.Pointer(&e[0 ])) return } func addbuf (buf []uint16 ,newcap int ) (newbuf []uint16 ){ newbuf=make ([]uint16 ,newcap) copy (newbuf,buf) return } func Utf16prt2str (p uintptr ) (str string ){ len :=0 buf:=make ([]uint16 ,64 ) for a:=(*(*uint16 )(unsafe.Pointer(p)));a!=0 ;len ++{ if len >=cap (buf){ buf=addbuf(buf,len *2 ) } buf[len ]=a p+=2 a=(*(*uint16 )(unsafe.Pointer(p))) } str=string (utf16.Decode(buf[:len ])) return }
go和c类型装换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #cgo char --> C.char --> byte signed char --> C.schar --> int8 unsigned char --> C.uchar --> uint8 short int --> C.short --> int16 short unsigned int --> C.ushort --> uint16 int --> C.int --> int unsigned int --> C.uint --> uint32 long int --> C.long --> int32 or int64 long unsigned int --> C.ulong --> uint32 or uint64 long long int --> C.longlong --> int64 long long unsigned int --> C.ulonglong --> uint64 float --> C.float --> float32 double --> C.double --> float64 wchar_t --> C.wchar_t --> void * -> unsafe.Pointer #window uint64 uint32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 var i int ci := C.int (i) var i C.int goi := int (i) var str string cstr := C.CString(str) import "C" import "fmt" func main () { fmt.Printf("%s\n" , C.GoString(&C.foo[0 ])) fmt.Printf("%s\n" , C.GoString(C.bar)) } import "C" import "fmt" func main () { goIArray := C.cIArray[:] fmt.Println(goIArray) goFArray := C.cFArray[:] fmt.Println(goFArray) } c_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使用小写表示
| 强制转换 | 隐式转换 | 类型断言 | |:--------- | :---------- | :---------- | :----| |类型之间 | 可以 | 不可以 | 可以| |类型->接口 | 可以 | 可以 | 可以| |接口->类型 | 不可以 | 不可以 | 可以| |接口之间 | 可以(编译期间确定) | 可以(编译期间确定) | 可以|