如何将 interface{} 转换回其原始结构?

2024-04-28

我需要一种方法将结构/接口动态转换回其原始对象。 我可以在里面添加方法/函数。基本上我需要这样的东西:

MyStruct  =>  Interface{}  => MyStruct

在最终转换时,除了结构内部的内容之外,我对原始结构一无所知,所以我不能这样:

a.(MyStruct)

您至少需要知道它可能的类型。有几种情况,1.你认为你可能知道它是什么。 2. 您有可能的类型列表, 3. 您的代码对底层类型一无所知。

  1. 如果您认为您知道,可以使用类型断言将其转换回原始结构类型。

...

package main

import (
    "fmt"
)

type MyStruct struct {
  Thing string
}

func (s *MyStruct) Display() {
  fmt.Println(s.Thing)
}

type Thingable interface {
  Display()
}

func main() {
  s := &MyStruct{
    Thing: "Hello",
  }

  // print as MyThing
  s.Display()

  var thinger Thingable
  thinger = s

  // print as thingable interface
  thinger.Display()

  // convert thinger back to MyStruct
  s2 := thinger.(*MyStruct) // this is "type assertion", you're asserting that thinger is a pointer to MyStruct. This will panic if thinger is not a *MyStruct

  s2.Display()
}

您可以在这里看到它的实际效果:https://play.golang.org/p/rL12Lrpqsyu https://play.golang.org/p/rL12Lrpqsyu

请注意,如果您想测试类型而不因错误而惊慌,请执行以下操作s2, ok := thinger.(*MyStruct)。如果成功则 ok 为 true,否则为 false。

  1. 如果您想针对多种类型测试接口变量,请使用开关:(滚动到底部)

...

package main

import (
    "fmt"
    "reflect"
)

type MyStruct struct {
    Thing string
}

type MyStruct2 struct {
    Different string
}

func (s *MyStruct) Display() {
    fmt.Println(s.Thing)
}

func (s *MyStruct2) Display() {
    fmt.Println(s.Different)
}

type Thingable interface {
    Display()
}

func main() {
    s := &MyStruct{
        Thing: "Hello",
    }

    // print as MyThing
    s.Display()

    var thinger Thingable
    thinger = s

    // print as thingable interface
    thinger.Display()

    // try to identify thinger
    switch t := thinger.(type) {
    case *MyStruct:
        fmt.Println("thinger is a *MyStruct. Thing =", t.Thing)
    case *MyStruct2:
        fmt.Println("thinger is a *MyStruct2. Different =", t.Different)
    default:
        fmt.Println("thinger is an unknown type:", reflect.TypeOf(thinger))
    }
}

你可以在这里尝试一下https://play.golang.org/p/7NEbwB5j6Is https://play.golang.org/p/7NEbwB5j6Is

  1. 如果您确实对底层类型一无所知,则必须通过接口函数公开您需要的内容并调用它们。您很可能可以在不了解底层类型的情况下执行此操作。如果其他方法都失败,您可以使用reflect包来内省您的接口对象并收集有关它的信息。这就是 json 包读取 json 文本并返回填充结构的方式 - 尽管这是一个高级主题,如果您采用此方法,预计会花费大量时间。最好将反射代码隐藏在具有干净接口(即包 api)的包内。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 interface{} 转换回其原始结构? 的相关文章

  • “struct X typedef”与“typedef struct X”的含义是什么?

    我在现有代码库中有以下 工作 代码 在 C 和 C 之间共享的包含文件中使用 在 MSVC 2010 和 Windows DDK 上编译 struct X USHORT x typedef X PX And enum MY ENUM enu
  • 如何使用 mongo-go-driver 有效地将 bson 转换为 json?

    我想将 bson 转换为mongo go 驱动程序 https github com mongodb mongo go driver有效地转换为 json 我应该小心处理NaN 因为json Marshal失败如果NaN存在于数据中 例如
  • 如何判断Python对象是否是字符串?

    如何检查 Python 对象是否是字符串 常规字符串或 Unicode Python 2 Use isinstance obj basestring 对于要测试的对象obj Docs https docs python org 2 7 li
  • 为什么 Python 布尔值占用超过一个字节?

    显然 Python 中整数占用 24 个字节 我可以理解 它这样做是因为代表无限数字的额外花哨 然而 布尔数据类型看起来也花费了高达 24 个字节 尽管它只能表示两个可能值之一 为什么 除了 1 位表示之外 还可能需要存储哪些额外数据Tru
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 我可以在 where 子句中使用 or ( || ) 吗?

    我正在尝试延长Array类型 但我只希望类型为时可用的函数Int or Float 我知道我可以针对一种类型执行此操作 extension Sequence where Iterator Element Int 但我可以对多种类型执行此操作
  • 在读/写二进制数据结构时访问位域

    我正在为二进制格式编写一个解析器 这种二进制格式涉及不同的表 这些表同样采用二进制格式 通常包含不同的字段大小 其中 50 100 个之间 大多数这些结构都有位域 并且在 C 语言中表示时看起来像这样 struct myHeader uns
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • 有没有一种方法可以在不停机的情况下更新 net/http 服务器中的 TLS 证书?

    我有一个简单的 https 服务器 提供一个简单的页面 如下所示 为简洁起见 没有错误处理 package main import crypto tls fmt net http func main mux http NewServeMux
  • C++ 删除 static_cast (指针)行为

    假设代码执行以下操作 T pointer new T delete static cast
  • 映射存在类型列表

    我有一个要映射的存在类型对象的列表 像这样的东西 sealed abstract class IntBox val v Int case object IB1 extends IntBox 1 case object IB2 extends
  • 如何在 Visual Studio Code 中使用 Delve 调试器进行远程调试

    我已经问过了 得到了很好的答复answer https stackoverflow com questions 39058823 how to use delve debugger in visual studio code用于使用 del
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • Go中如何自定义http.Client或http.Transport超时重试?

    我想实现一个自定义http Transport对于标准http Client 如果客户端超时 它将自动重试 附 由于某种原因 习俗http Transport is a 一定有 我已经查过了hashcorp go retryablehttp
  • 当涉及多个渠道时,select 如何工作?

    我发现在多个非缓冲通道上使用 select 时 例如 select case lt chana case lt chanb 即使两个通道都有数据 但在处理此选择时 case chana 和 case chanb 的跟注不平衡 package
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6
  • Go io.Pipe 的缓冲版本

    有缓冲版本吗io Pipe https golang org pkg io Pipe 在标准库或第三方库中 在我推出自己的库之前 上下文 我正在尝试使用这个解决方案 https stackoverflow com a 36229262 15
  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc

随机推荐

  • 如何用Spring进行只读和读写的数据库路由

    我正在研究 Spring 中的事务路由 但我的应用程序存在运行时问题 我有两个 MySQL 数据库 一个用于读取 一个用于读 写 但是我的路由配置不起作用 当我应用只读配置时 我没有成功 这是我的配置 pom xml
  • Akka、SQS 和 Camel 的消费者投票率

    我正在做的一个项目需要从SQS读取消息 我决定使用Akka来分布式处理这些消息 由于 Camel 支持 SQS 并且在 Consumer 类中内置了 Akka 中使用的功能 因此我认为最好以这种方式实现端点并读取消息 尽管我还没有看到很多人
  • 如何在中等规模的 Rails 应用程序中组织控制器?

    我正在开发一个具有相当多相关模型的应用程序 并且想听听一些关于如何最好地组织控制器的意见 以下是我一直在考虑的一些选择 1 为控制器命名空间 例如 有一个controllers admin 目录和一个controllers public 目
  • Apache mod_rewrite:在 Windows 计算机上使用 PHP 脚本的 RewriteMap 指令

    这已经让我发疯了 我似乎无法让 RewriteMap 指令适用于 Windows 上的 php 脚本 这是我的 httpd conf 文件中的相关片段
  • 在 AspNet WebApi 帮助页面中生成模型描述

    我如何生成一个描述对于 Asp Net Web Api 帮助页面中的我的模型 Example 正如您从示例中看到的 我已经可以生成Name Type and Additional Information 但我如何生成Description
  • 部署后配置文件中缺少

    更新 我在下面有一个问题 但实际上我的问题可以通过提出一个稍微不同的问题来解决 为什么在某些机器上我的应用程序会抛出错误 Configuration system failed to initialize System Configurat
  • 由于 QCoreApplication 事件循环,QThread 永远不会退出

    Problem 所以我有一个 CommandRetriever 类来保存一些命令 并且should在不同的线程上执行这些命令 class CommandRetriever public CommandRetriever CommandRet
  • Azure DevOps API 版本定义

    尝试从其他项目复制发布模板时出现以下错误 VS402982 未为 PROJECT ENV 阶段设置保留策略 发布管道级别的保留策略已弃用 id 8 name PROJECT ENV rank 1 owner displayName Zoe
  • 根据一列删除重复项并保留最后一个条目

    我正在尝试根据一列删除重复项并保留最后一个条目 现在我的公式保持第一个值 我正在使用这篇文章中找到的公式 选择具有不同列值的所有行 Google 查询语言 https stackoverflow com questions 30318460
  • 关闭 MAMP 中的缓存

    尝试关闭 MAMP 中的缓存进行开发 在进行小更改后等待缓存过期会降低我的工作效率 当我更改为 PHP 5 5 3 时出现问题 更改回来并不能解决问题 经过研究 我采取了以下步骤来 未成功 禁用缓存 注释掉 php ini 中的 OPcac
  • 引用的项目x不存在

    大家好 我将一个项目的解决方案从vs2008升级到vs2010 但现在我有一个奇怪的问题 我在多个解决方案中引用了一个项目 3个解决方案 在其中两个解决方案中 引用出现错误 我可以添加引用 项目引用 但是当我构建时 我收到警告 引用的项目
  • iOS Siri 意图扩展“我没有看到适用于该功能的应用程序。您需要下载一个。”

    我正在编写一个 Swift 框架 其中包含 Siri 意图定义文件和代码 可从主应用程序 Today 扩展和 Siri 意图扩展中使用 我正在使用 Cocoapods 来分发框架 它位于私人存储库中 因此我无法共享框架本身 这非常适合从应用
  • JTable 中的格式化字段问题 - Integer 和 Double 之间的差异

    更新 已确认为错误当 columnClass 为 Double 时 JTable 无法将给定对象格式化为 Number 错误 ID 7051636 https bugs java com bugdatabase view bug bug i
  • Docker:入口点的覆盖涉及CMD规范?

    这是我纯粹好奇的问题 我必须个性化 Docker 映像 特别是这是我的 dockerfile 的摘录 ARG DEFAULT PHP VERSION FROM php DEFAULT PHP VERSION DEFAULT PHP VERS
  • 使用带有部分模板文件的 i18n gem 时出现问题

    我正在使用 Ruby on Rails 3 1 我想知道如何正确处理与部分模板文件相关的国际化 那是 在我的app views users flag html erb我有的文件 在我的app views users flag form ht
  • Ace Editor 获取当前选定的行号和文本

    我目前正在使用 Ace Editor 但我在文档中找不到与检索当前所选行号及其文本相关的任何内容 有任何想法吗 首先 定义 选定行 ace 中的选择可以跨多行设置 如果您的意思是 未设置选择 当前行是光标闪烁的行 var currline
  • Beautiful Soup 中 find_all 方法的返回类型是什么?

    from bs4 import BeautifulSoup SoupStrainer from urllib request import urlopen import pandas as pd import numpy as np imp
  • Web2Py 无法连接到 MSSQL

    我无法让 web2py 连接到 mssql
  • python setup.py Egg_info 失败,错误代码 1

    我正在运行 Ubuntu 17 04 全新安装 并且已经安装了 pip 但是 当我尝试安装任何东西时 我得到以下信息 命令 python setup py Egg info 失败 错误代码为 1 tmp pip build kBfUEp k
  • 如何将 interface{} 转换回其原始结构?

    我需要一种方法将结构 接口动态转换回其原始对象 我可以在里面添加方法 函数 基本上我需要这样的东西 MyStruct gt Interface gt MyStruct 在最终转换时 除了结构内部的内容之外 我对原始结构一无所知 所以我不能这