在go(golang)中,如何将接口指针转换为结构指针?

2024-01-29

我想使用一些需要指向结构的指针的外部代码。在调用代码时,我有一个接口变量。

当从该变量创建指针时,指针的类型是interface{}*当我需要它作为结构类型的指针类型时。

图像中的代码TestCanGetStructPointer 不知道 Cat 类,并且它存在于某些外部包中。

我怎样才能把它投射到这个?

这是一个代码示例:

import (
    "reflect"
    "testing"
)   

type Cat struct {
    name string
}

type SomethingGeneric struct {
    getSomething func() interface{}
}

func getSomeCat() interface{} {
    return Cat{}
}

var somethingForCats = SomethingGeneric{getSomething: getSomeCat}

func TestCanGetStructPointer(t *testing.T) {
    interfaceVariable := somethingForCats.getSomething()

    pointer := &interfaceVariable

    interfaceVarType := reflect.TypeOf(interfaceVariable)
    structPointerType := reflect.PtrTo(interfaceVarType)
    pointerType := reflect.TypeOf(pointer)

    if pointerType != structPointerType {
        t.Errorf("Pointer type was %v but expected %v", pointerType, structPointerType)
    }

}

测试失败并显示:

Pointer type was *interface {} but expected *parameterized.Cat


@dyoo 的示例确实有效,但它依赖于您手动投射Dog and Cat.

这是一个有点复杂/冗长的示例,它在某种程度上避免了这种限制:

package main

import (
    "fmt"
    "reflect"
)

type Cat struct {
    name string
}

type SomethingGeneric struct {
    getSomething func() interface{}
}

func getSomeCat() interface{} {
    return Cat{name: "Fuzzy Wuzzy"}
}

var somethingForCats = SomethingGeneric{getSomething: getSomeCat}

func main() {
    interfaceVariable := somethingForCats.getSomething()
    castVar := reflect.ValueOf(interfaceVariable)
    castVar.Convert(castVar.Type())

    // If you want a pointer, do this:
    fmt.Println(reflect.PtrTo(castVar.Type()))

    // The deref'd val
    if castVar.Type() != reflect.TypeOf(Cat{}) {
        fmt.Printf("Type was %v but expected %v\n", castVar, reflect.TypeOf(&Cat{}))
    } else {
        fmt.Println(castVar.Field(0))
    }
}

游乐场链接 http://play.golang.org/p/GalgPFeSyd

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在go(golang)中,如何将接口指针转换为结构指针? 的相关文章

  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 有队列实现吗?

    任何人都可以建议使用 Go 容器来实现简单快速的 FIF 队列 Go 有 3 种不同的容器 heap list and vector 哪一种更适合实现队列 事实上 如果您想要的是一个基本且易于使用的 fifo 队列 slice 可以满足您所
  • 将 time.Time 转换为字符串

    我正在尝试将数据库中的一些值添加到 string在围棋中 其中一些是时间戳 我收到错误 无法在数组元素中使用 U Created date 类型 time Time 作为类型字符串 我可以转换吗time Time to string typ
  • 为什么 json.Unmarshal 返回映射而不是预期的结构?

    看看这个游乐场 http play golang org p dWku6SPqj5 http play golang org p dWku6SPqj5 基本上 我正在工作的图书馆收到了interface 作为参数 然后需要json Unma
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

    我想要来自不同子目录的分隔符逻辑模板templates文件夹 下面是我的templates文件夹 templates authentication login gohtml logout gohtml index gohtml profil
  • 如何仅在测试时允许一个包访问另一个包的未导出数据?

    In Go 编程语言 第 11 2 4 节 有一个外部测试访问的示例fmt isSpace 通过声明IsSpace in fmt s export test go文件 这似乎是完美的解决方案 所以这就是我所做的 a a go package
  • 如何关闭 gorm 1.20.0 中的数据库实例

    由于我没有在 Close 函数中找到 gorm 实例 任何帮助将不胜感激 dbURI fmt Sprintf user s password s dbname s port s sslmode s TimeZone s username p
  • 在 Gorilla Mux 中嵌套子路由器

    我一直在使用gorilla mux https github com gorilla mux满足我的路由需求 但我注意到一个问题 当我嵌套多个子路由器时它不起作用 这是示例 func main r mux NewRouter StrictS
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • 与通道相比,sync.WaitGroup 的优势是什么?

    我正在开发一个并发 Go 库 我偶然发现了 goroutine 之间两种不同的同步模式 其结果相似 等待组 https play golang org p ZYPLlcp16TZ package main import fmt sync t
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • 什么时候返回结构体指针是个好主意?

    我正在学习 Go 我对何时使用指针有点困惑 具体来说 当返回一个struct从函数中 什么时候适合返回结构体实例本身 什么时候适合返回指向结构体的指针 示例代码 type Car struct make string model strin
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • 关闭长度未知的通道

    当不了解频道时我无法关闭频道 length package main import fmt time func gen ch chan int var i int for time Sleep time Millisecond 10 ch
  • 如何将长 Go 模板函数拆分为多行?

    我有一个很长的printf调用 Go 模板 例子 printf mongodb s s s s authSource admin replicaSet s readPreference nearest w majority Values r
  • 子字符串和 Go 垃圾收集器

    在 Go 中获取字符串的子字符串时 不会分配新的内存 相反 子字符串的底层表示包含一个数据指针 该指针是原始字符串的数据指针的偏移量 这意味着 如果我有一个大字符串并希望跟踪一个小子字符串 则垃圾收集器将无法释放任何大字符串 直到我释放对较
  • golang中如何将相对路径解析为绝对路径?

    节点中是否有类似 path resolve 的API 或者有什么东西可以做同样的事情 例如 nodejs代码 path resolve sample sh 应该得到 home currentuser sample sh 解决 表示用户主目录

随机推荐

  • pandas 找到最早出现的语句并设置为启动器

    考虑以下 df data Name John John Lucy Lucy Lucy Payroll 15 15 75 75 75 Week 1 2 1 2 3 df pd DataFrame data Name Payroll Week
  • 根据 Typescript 中同级属性的泛型类型推断类型

    我想根据属性的同级属性的泛型类型来定义属性的类型 例如 假设我们有 type Person id number name string type Select
  • 使用 JavaScript/JQuery 使导航链接在相关元素经过其下方时突出显示?

    我有一个带有导航菜单的单页网站position fixed在页面顶部 当我单击导航菜单中的链接时 页面会使用以下 JQuery 滚动到相应的部分 a href live click function event event preventD
  • CSS中如何从右向左缩放?

    我正在尝试对 div 元素进行动画缩放 但动画是从中心开始扩散的 有没有办法让动画从右开始并向左传播 graybox float right background color gray height 100px width 400px li
  • istio-proxy 在 1 小时后关闭长时间运行的 TCP 连接

    TL DR 我们如何配置 istio sidecar 注入 istio proxy envoy proxy istio egressgateway 以允许长期存在 gt 3 小时 可能空闲的 TCP 连接 一些细节 我们正在尝试执行到 Po
  • 某些 Android 设备将内部存储视为 SD 卡,将外部存储视为 EXTSD

    我有很多来自不同供应商的 Android 设备 其中一些将 mnt sdcard 连接到内部存储 将 mnt extsd 连接到 外部存储 场景1 和其他将 mnt sdcard附加到外部存储 场景2 我认为第二种情况是标准的 因为 And
  • 为什么2to3将mydict.keys()更改为list(mydict.keys())?

    我正在查看 2to3 的输出 其中包含此更改 for file prefix in output keys for file prefix in list output keys where output是一本字典 这一变化有何意义 2to
  • 使用 sed 查找并除以文件中的所有数字

    我试图在 json 文件中查找所有数字 并在 mac 上使用 sed 将它们替换为原始数字的一半值 例如 这里我搜索2010并将其替换为1005 file data json sed i E s 0 9 2010 0 9 1 1005 2
  • 超过 2^32 的枚举标志

    我在我的应用程序中使用枚举标志 枚举可以有大约 50 多个值 因此值最多为 2 50 我只是想知道我可以使用Math Pow 2 variable 来计算这些 当我尝试这样做时 我得到了恒定值编译时错误 除了手动计算 2 的幂并将其代入之外
  • 如何在 .vimrc 中换行?

    我已经设置了一个colorcolumn 80 但我发现我无法在 vimrc 中换行长行 有没有类似C的方法 连接 例如我尝试过这个 但它不起作用 autocmd FileType python setlocal ai si et sta s
  • Android Market - 两次更新之间的等待时间

    我想知道我必须等待多少次才能发布我的申请更新 我想确保更新会出现在 Android 市场的 新闻 部分 你正试图玩弄市场体系 不要那样做 在需要更新时更新您的应用程序 即当您有新功能或错误修复时 根据我的经验 更新太频繁会让现有用户生气 并
  • for 带有 Twig 或 Swig 的循环计数器

    任何人都知道在 Twig Swig 中执行此操作的干净方法 for i 0 i lt 100 i blah endfor 如果你有一个数字 那么你可以将其转换为数组 然后使用 Swig 的标签标准 如果您总是想从 0 开始循环 这是最简单的
  • 增加MongoDB最大连接数

    我在 MongoDB 端遇到一些错误 错误是抱怨它达到了允许的最大连接数 想知道是否有办法增加允许的最大连接数 查看 MongoDB 文档 http www mongodb org http www mongodb org 使用此命令行参数
  • javascript、jquery时间格式

    我有一个问题 如何在 javascript 或 Jquery 中将时间从 24 小时格式更改为 12 小时 最简单的方法 这就是我所拥有的 TempDate datepicker formatDate MM dd yy TempDate v
  • HelloAndroid模拟器问题

    我是第一次尝试 android SDK 我从 HelloAndroid 教程开始 完全遵循每个步骤 但模拟器在没有我的应用程序的情况下启动 日食控制台说 2010 02 23 11 47 55 HelloAndroid 2010 02 23
  • Google 表格复选框结果作为新行

    我们在谷歌表单上有复选框 可以将其输入到谷歌表格中 对复选框的响应以逗号分隔 我们想知道是否可以有新行 这是表单填充工作表的方式 Col A Col B Name Availability Larry Monday Sergey Monda
  • 将数据库表行直接反序列化为 C# 对象 - 有这样做的机制吗?

    我是 C 新手 这可能最终是一个愚蠢的问题 但无论如何我都需要问 C 是否有一种机制可以将执行的 SQL 语句的结果反序列化为 C 对象 我有一个 C 程序 它从 SQL 服务器读取一个表 将行存储在对象中 我手动将每个列值分配给对象成员
  • 如何保持实时 MediaSource 视频流同步?

    我有一个服务器应用程序 它渲染 30 FPS 视频流 然后将其实时编码和复用为WebM 字节流 https dvcs w3 org hg html media raw file tip media source webm byte stre
  • 在页面加载时使用 AngularJS 将 json 绑定到 HTML 表

    我有一个简单的概念验证 我用它作为学习一些 AngularJS 的基础 该代码在 HTML 表中显示一些 JSON 数据 如下所示 HTML div div p Click a here a to load data p table tr
  • 在go(golang)中,如何将接口指针转换为结构指针?

    我想使用一些需要指向结构的指针的外部代码 在调用代码时 我有一个接口变量 当从该变量创建指针时 指针的类型是interface 当我需要它作为结构类型的指针类型时 图像中的代码TestCanGetStructPointer 不知道 Cat