”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何访问Go的CGo中的联合字段?

如何访问Go的CGo中的联合字段?

发布于2024-11-06
浏览:338

How to Access Union Fields in Go\'s CGo?

在 Golang CGo 中将 Union 字段转换为 Go 类型

在 Golang CGo 中使用 C 结构时,访问 union 字段可能是一个挑战。常见场景涉及访问 C 结构内值联合中的 ui32v 字段,如下例所示:

struct _GNetSnmpVarBind {
  guint32       *oid;       /* name of the variable */
  gsize     oid_len;    /* length of the name */
  GNetSnmpVarBindType   type;       /* variable type / exception */
  union {
    gint32   i32;           /* 32 bit signed   */
    guint32  ui32;          /* 32 bit unsigned */
    gint64   i64;           /* 64 bit signed   */
    guint64  ui64;          /* 64 bit unsigned */
    guint8  *ui8v;          /*  8 bit unsigned vector */
    guint32 *ui32v;         /* 32 bit unsigned vector */
  }         value;      /* value of the variable */
  gsize     value_len;  /* length of a vector in bytes */
};

注意:在此示例中,我们在 64 位平台上。

失败的方法:转换为 uint64 并强制转换

最初的方法可能涉及将 union 字段的内容转换为 uint64,假设它表示内存地址,然后将该 uint64 转换为 *_Ctype_guint32。然而,这种方法会导致类型转换错误。

正确的方法:使用 Union 的地址

相反,正确的方法是使用 Union 的地址工会本身。在 CGo 中,联合被公开为一个足以容纳其最大成员的字节数组。在本例中,该数组为八个字节 ([8]byte)。通过使用该数组的地址,我们可以直接将其转换为所需的类型。

对于 C._GNetSnmpVarBind 命名数据,以下代码演示了这种方法:

guint32_star := *(**C.guint32)(unsafe.Pointer(&data.value[0]))

代码细分:

  • &data。 value[0] 获取值联合中第一个字节的地址。
  • unsafe.Pointer(&data.value[0]) 将此地址转换为 unsafe.Pointer 类型的指针。
  • (**C.guint32)(unsafe.Pointer(&data.value[0])) 将 unsafe.Pointer(&data.value[0]) 指向的内存解释为 **C.guint32,有效访问 ui32v字段作为指向 guint32 的指针。

这种简化的方法允许直接访问 Go 代码中的联合字段。

最新教程 更多>
  • 使用 React 构建 Loop Studio
    使用 React 构建 Loop Studio
    介绍 Loop Studio 是一个沉浸式网站,旨在展示各种虚拟现实 (VR) 项目。使用 React,我们可以有效地管理和渲染不同的组件,以构建有凝聚力和交互式的用户体验。该项目采用简洁的设计,带有导航标题、详细的 VR 部分、创作画廊以及带有社交媒体链接的页脚。 ...
    编程 发布于2024-11-06
  • 如何解决用PHP在CURL中发送多维数组时出现“数组到字符串转换”错误?
    如何解决用PHP在CURL中发送多维数组时出现“数组到字符串转换”错误?
    通过 CURL 和 PHP 发送多维数组使用 CURL 发布包含多维数组的表单数据时,遇到“数组到字符串转换”错误是一个常见问题。当尝试使用包含数组的数组设置 CURLOPT_POSTFIELDS 时会发生这种情况。由于 Content-Type 标头必须是 multipart/form-data ...
    编程 发布于2024-11-06
  • 如何在 Selenium 中使用 \"span:contains(\'String\')\" 解决 InvalidSelectorException?
    如何在 Selenium 中使用 \"span:contains(\'String\')\" 解决 InvalidSelectorException?
    Selenium 中的 Invalid SelectorException with "span:contains('String')"在 Firefox 中使用 Python 中的 Selenium 时,尝试使用 CSS 选择器“span:contains(&#...
    编程 发布于2024-11-06
  • 如何将 HTML 附加到容器元素而不出现 InnerHTML 陷阱?
    如何将 HTML 附加到容器元素而不出现 InnerHTML 陷阱?
    在没有innerHTML的情况下将HTML附加到容器元素重新访问当前的问题是如何将HTML附加到容器元素,同时避免限制以及使用innerHTML属性的陷阱。正如OP正确指出的那样,innerHTML由于其替换现有内容的行为,可能会破坏嵌入媒体等动态元素。幸运的是,有一个替代方案可以克服这些问题:in...
    编程 发布于2024-11-06
  • 持续测试:确保 DevOps 管道的质量
    持续测试:确保 DevOps 管道的质量
    持续测试是现代软件开发中的关键实践,尤其是在 DevOps 框架内。它涉及在整个软件交付管道中自动执行测试,以确保对代码库所做的每项更改都得到彻底验证。通过将测试集成到开发过程的每个阶段,持续测试旨在尽早发现和解决缺陷,从而显着降低生产故障的风险。 什么是持续测试? 持续测试是作为软件交付管道的一...
    编程 发布于2024-11-06
  • 背景颜色改变视频
    背景颜色改变视频
    在 Instagram 上关注我们 在本视频教程中,我将指导您使用 HTML、CSS 和 JavaScript 构建令人惊叹的 Instagram 卡片。该卡片具有充满活力的变色边框、圆形个人资料图片和“关注我们”按钮,为您的在线形象增添了吸引力。该项目非常适合增强您的作品集或社交媒体页面,展示了简...
    编程 发布于2024-11-06
  • 如何使用 PHP 清除浏览器缓存?
    如何使用 PHP 清除浏览器缓存?
    使用 PHP 清除浏览器缓存浏览器缓存将经常访问的文件存储在本地,从而缩短网站加载时间。但是,如果缓存的文件已过时,它也会干扰测试和开发。本文介绍如何使用 PHP 清除浏览器缓存。清除浏览器缓存的 PHP 代码以下 PHP 代码将标头发送到客户端浏览器,指示其清除其缓存:header("C...
    编程 发布于2024-11-06
  • AWS Lambda 与 Go,初始样板
    AWS Lambda 与 Go,初始样板
    照片由 Lukáš Vaňátko 在 Unsplash 上拍摄 介绍 Go 由于其简单性一直是我最喜欢的语言之一。最近,我决定弄清楚如何使用用 Go 编写的 lambda 函数创建一个简单的样板无服务器项目。我对工具和开发人员体验很好奇。 目标 我想创建一个 RES...
    编程 发布于2024-11-06
  • 在 Laravel 中对底部为空值和非空值的行进行降序排序
    在 Laravel 中对底部为空值和非空值的行进行降序排序
    使用数据库时,经常会遇到某些字段可能为空或 NULL 的情况。经常出现的一个挑战是如何对记录进行排序,以便具有空字段的行出现在结果集的底部,而具有非空值的行以有意义的方式排序(例如,降序)。在这篇文章中,我将通过一个实际示例向您展示如何在 Laravel 中实现这一目标。 设想 假设...
    编程 发布于2024-11-06
  • 橄榄油的好处
    橄榄油的好处
    橄榄油的好处 橄榄油通常被誉为地中海饮食的基石,不仅可以为各种菜肴增添风味,而且还对健康有益。橄榄油从橄榄树的果实中提取,已经使用了几个世纪,现代研究不断发现它的许多优点。以下是将橄榄油纳入饮食的一些主要好处: 1. 心脏健康 橄榄油富含单不饱和脂肪,尤其是油酸,众...
    编程 发布于2024-11-06
  • JSON Diff:开发人员完整指南
    JSON Diff:开发人员完整指南
    JSON(JavaScript 对象表示法)是一种广泛使用的数据格式,用于在系统之间交换信息。当开发人员使用 API、数据库和配置时,确保 JSON 数据保持一致和准确至关重要。这就是 JSON diff 发挥作用的地方。 JSON diff 工具允许开发人员快速发现两个 JSON 结构之间的差异...
    编程 发布于2024-11-06
  • 你应该知道的 JavaScript 技巧
    你应该知道的 JavaScript 技巧
    蔡乔布撰写 1. 控制台.log 为控制台日志添加颜色 别再这样做了! ❌ 试试这个吧。 ✅ 但如果你有一个对象数组,尝试这个会更好吗? 如果您想测量代码中某些操作的运行速度,请尝试此操作。 执行console.time和console.timeEnd来测量浏览器控制台中花费的时间。...
    编程 发布于2024-11-06
  • 掌握使用 Python 抓取 Google Scholar 的艺术
    掌握使用 Python 抓取 Google Scholar 的艺术
    如果您正在深入进行学术研究或数据分析,您可能会发现自己需要来自 Google 学术搜索的数据。不幸的是,没有官方的 Google Scholar API Python 支持,这使得提取这些数据有点棘手。然而,凭借正确的工具和知识,您可以有效地抓取 Google Scholar。在这篇文章中,我们将探...
    编程 发布于2024-11-06
  • 使用 Go、Clean Architecture 和 PostgreSQL 构建强大的电子商务平台
    使用 Go、Clean Architecture 和 PostgreSQL 构建强大的电子商务平台
    概述 我们的目标是开发一个全面的电子商务解决方案,可以处理从产品管理到订单处理的所有事务。该平台将成为在线业务的坚实基础,能够扩展以满足不断增长的需求并适应不断变化的市场需求。 我们的电子商务平台的主要功能包括: 用户身份验证和个人资料管理 包含类别和子类别的产品目录 购物车功能 ...
    编程 发布于2024-11-06
  • Redis 解释:主要功能、用例和实践项目
    Redis 解释:主要功能、用例和实践项目
    Introduction Redis is an open-source, in-memory data structure store used as a database, cache, and message broker. It’s known for its perfor...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3