go调用c全面解析

2018-10-17  本文已影响17人  水上清风

一、go的指针

pointer type、 uintptr和unsafe.Pointer

    b := []byte{0x01, 0x02, 0x3, 0x4}
    var u16 uint16

    pb := unsafe.Pointer(&b[1]) //pb指向b第二个元素的地址,注:&b不是slice的第一元素的地址,要用&b[0],如果为数组 [4]byte{}则&b为第一个元素的地址,原因参与雨痕的go学习笔记。
    u16 = *((*uint16)(pb))      //将b的2,3元素转为一个uint16的数,小端模式0x0302,大端模式0x0203; intel和amd CPU都是小段模式
    fmt.Printf("u16:%#04x\n", u16) //0x0302
    var u16 uint16
    var p uintptr
    b := [4]byte{0x01, 0x02, 0x3, 0x4}
    //uintptr和指针类型不能直接转换
    //p = uintptr(&b)           //cannot convert &b (type *[4]byte) to type uintptr
    //u16 = *((*uint16)(p + 2)) //cannot convert p + 2 (type uintptr) to type *uint16
    pb := unsafe.Pointer(&b)
    p = uintptr(pb)
    fmt.Printf("p:%p\n", p) //p:0xc000071f5c
    p++
    pb = unsafe.Pointer(p)
    u16 = *((*uint16)(pb))
    fmt.Printf("u16:%#04x\n", u16) //u16:0x0302

二、go中直接嵌入C代码

三、go调用windows的dll

四、go调用linux的so

五、go代码编译为dll和so

上一篇下一篇

猜你喜欢

热点阅读