Go黑魔法之cgo & reflect访问list存储C指针

本文介绍在Golang中如何使用reflect包处理container/list存储的C指针,通过示例代码展示了如何将Element.Value转换为unsafe.Pointer并访问C结构体。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用 container/list 过程中用其保存C指针,但是发现通过Element ->Value 获取元素值并不能直接转换为unsafe.Pointer使用,只能祭出reflect 大法。通过reflect -> ValueOf -> Pointer 搞定,以下是示例:

package main
// go build -gcflags=all="-N -l"  clist.go

/*
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

struct Dog {
    int id;
    char name[16];
};
*/
import "C"
import (
    "log"
    "fmt"
    "reflect"
    "unsafe"
    "container/list"
)

func main() {
    l := list.New()
    var ptr *C.struct_Dog
    for i := 1; i < 5; i ++ {
        dog := C.malloc(C.sizeof_struct_Dog)
        if dog == nil {
            log.Print("malloc error")
            return
        }
        ptr = (*C.struct_Dog)(unsafe.Pointer(dog))
        ptr.id = C.int(i)
        fmt.Println("Add Dog", dog)
        l.PushBack(unsafe.Pointer(dog))
    }
    log.Print("Init list done.");
    for e := l.Front(); e != nil; e = e.Next() {
        v := e.Value
        ptr = (*C.struct_Dog)(unsafe.Pointer(reflect.ValueOf(v).Pointer()))
        fmt.Println("Dog", unsafe.Pointer(ptr), "id ", ptr.id)
        c.free(unsafe.Pointer(ptr))
    }
 }

输出

Add Dog 0x8367e0
Add Dog 0x836800
Add Dog 0x836820
Add Dog 0x836840
2018/12/15 17:37:35 Init list done.
Dog 0x8367e0 id  1
Dog 0x836800 id  2
Dog 0x836820 id  3
Dog 0x836840 id  4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值