意外返回匿名结构

2023-12-22

我正在尝试实现一种方法,该方法返回基于原始结构的修改后的结构,例如:

type Project struct {
    Username string           
    Id       uint      
    Alias    string           
    Data     *json.RawMessage 
    Scheme   Scheme          
}

func (p *Project) OmitUsername() *struct {

    return &struct {
        Id      uint         
        Alias   string   
        Data    *json.RawMessage
        Scheme  Scheme          
    }{
        p.Id,
        p.Alias,
        p.Data,
        p.Scheme
    })
}

我收到以下错误:

models/project.go:22: syntax error: unexpected return 
models/project.go:24: non-declaration statement outside function body 
models/project.go:25: non-declaration statement outside function body 
models/project.go:25: syntax error: unexpected string literal, expecting semicolon or newline 
models/project.go:26: non-declaration statement outside function body

任何帮助,将不胜感激。


具有“真正的”匿名结构返回值

如果你想使用匿名结构返回值,那看起来会非常难看。

为什么?因为当你定义返回类型时,你必须描述匿名结构。当你写一个return语句,您必须提供返回值,该值将是一个结构文字。匿名结构的结构文字也必须描述该结构!

当你尝试这样写时:

func (p *Project) OmitUsername() *struct {
    // return somethig
}

此语法不是您想象的那样:它不包含结构定义。基本上在你的例子中第一个{是匿名结构定义的左括号,并且not函数体的左括号。也正因如此,接下来的return被解释为位于匿名结构定义内部,这是无效语法,这也正是错误消息所指出的内容("syntax error: unexpected return").

它应该看起来像这样:

func (p *Project) OmitUsername() *struct {
    Id     uint
    Alias  string
    Data   *json.RawMessage
    Scheme Scheme
} {
    // And now here comes the return statement
}

如果您还添加了必须重复匿名结构定义的 return 语句:

func (p *Project) OmitUsername() *struct {
    Id     uint
    Alias  string
    Data   *json.RawMessage
    Scheme Scheme
} {
    return &struct {
        Id     uint
        Alias  string
        Data   *json.RawMessage
        Scheme Scheme
    }{p.Id, p.Alias, p.Data, p.Scheme}
}

是的,它很丑。您可以通过使用命名返回值而不返回指针来使其变得更简单,因为指针的零值是nil,并且要返回某些内容,您必须对其进行初始化,这还涉及重复匿名结构!如果您使用非指针、命名返回值,您将立即获得匿名结构体的值,并且不必再次重复匿名结构体定义,只需为其字段赋值即可:

func (p *Project) OmitUsername2() (ret struct {
    Id     uint
    Alias  string
    Data   *json.RawMessage
    Scheme Scheme
}) {
    ret.Id = p.Id
    ret.Alias = p.Alias
    ret.Data = p.Data
    ret.Scheme = p.Scheme
    return
}

使用它们:

p := Project{"Bob", 1, "bobie", nil, nil}
fmt.Println(p.OmitUsername())
fmt.Println(p.OmitUsername2())

输出(在去游乐场 http://play.golang.org/p/YLSTOwDjsC):

&{1 bobie <nil> <nil>}
{1 bobie <nil> <nil>}

还是丑...

对于另一个命名类型,使用嵌入

...最好是提供另一个命名类型来返回,而不是匿名结构。您可以利用嵌入为了使这个解决方案实用且简短:

type BaseProject struct {
    Id     uint
    Alias  string
    Data   *json.RawMessage
    Scheme Scheme
}

type Project struct {
    BaseProject
    Username string
}

func (p *Project) OmitUsername() BaseProject {
    return p.BaseProject
}

使用它:

p := Project{BaseProject{1, "bobie", nil, nil}, "Bob"}
fmt.Println(p.OmitUsername())

输出(在去游乐场 http://play.golang.org/p/QUv9SO-E1X):

{1 bobie <nil> <nil>}

Note:

嵌入并不是真正必要的,但这样嵌入类型的字段(BaseProject)将会被提升,所以你可以像这样参考它们p.Id就好像它们被定义在Project。将其定义为常规字段也可行。

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

意外返回匿名结构 的相关文章

  • 多个生产者,单个消费者:所有 goroutine 都在睡觉 - 死锁

    在继续工作之前 我一直遵循检查通道中是否有任何内容的模式 func consume msg lt chan message for if m ok lt msg ok fmt Println More messages m else bre
  • 如何使用 exec.Command 在 golang 中执行 Mysql 脚本

    您好 我正在尝试执行一个脚本以使用 Golang 将数据填充到数据库中 func executeTestScript cmd exec Command usr local mysql bin mysql h127 0 0 1 P3333 u
  • 在 Golang 中生成固定长度的随机十六进制字符串的有效方法?

    我需要生成很多固定长度的随机十六进制字符串 我找到这个解决方案golang中如何生成固定长度的随机字符串 https stackoverflow com a 31832326 710955 我正在做这样的事情 const letterByt
  • Go 中的数据竞争:为什么会在 10-11 毫秒以下发生?

    这是我运行的代码 package main import fmt time const delay 9 time Millisecond func main n 0 go func time Sleep delay n fmt Printl
  • 在 OSX 上交叉编译 Go?

    我正在尝试在 OSX 上交叉编译 go 应用程序以构建适用于 Windows 和 Linux 的二进制文件 我已经阅读了网上能找到的所有内容 我发现的最接近的例子已经发布在 除了疯狂邮件列表上许多未完成的讨论之外 http solovyov
  • go build 不断抱怨:go.mod 有 post-v0 模块路径

    Go 1 11 发布后 我一直在尝试将我的存储库移动到 Go 模块 方法是添加go mod文件在其根目录下 我的根库之一my host root其版本为17 0 1 所以我在其中写道go mod file module my host ro
  • C++ 编译器可以对结构中的元素重新排序吗

    C 编译器 特别是 g 可以对结构体的内部元素重新排序吗 我看到一些奇怪的行为 其中我有一个包含如下内容的结构 Struct SomeStruct long someLong long someLongArray 25 unsigned l
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种
  • 在 Go 中,如何将函数的 stdout 捕获到字符串中?

    例如 在 Python 中 我可以执行以下操作 realout sys stdout sys stdout StringIO StringIO some function prints to stdout get captured in t
  • 如何使用 go web 服务器提供静态 html 文件?

    如何使用 go web 服务器提供 index html 或其他静态 HTML 文件 我只想要一个基本的静态 HTML 文件 例如一篇文章 我可以从 Go Web 服务器提供该文件 HTML 应该可以在 go 程序之外进行修改 就像使用 H
  • 在 Go 中读取请求负载?

    我正在使用文件上传器 需要请求负载中的详细信息来裁剪它 func Upload w http ResponseWriter r http Request reader err r MultipartReader if err nil htt
  • 如何在Python中正确声明ctype结构+联合?

    我正在制作一个二进制数据解析器 虽然我可以依靠 C 但我想看看是否可以使用 Python 来完成该任务 我对如何实现这一点有一些了解 我当前的实现如下所示 from ctypes import class sHeader Structure
  • golang导入结构体指针

    好的 我有一个主包和一个 http 处理程序包 本质上我想做的是设置一个全局结构 这样我就可以随时调用该结构中的信息 我尝试的示例的基本概要如下 主包导入处理函数 主包调用handlerfunc Handlerfunc 将 http Res
  • 将 []string 传递给需要可变参数的函数

    为了不一遍又一遍地重复我的自我 我想创建一个处理运行一些命令的函数 func runCommand name string arg string error cmd exec Command name arg if err cmd Run
  • 从 Go Slice 中选择一个随机值

    情况 我有一些值 需要从中随机选择一个值 然后我想将它与固定字符串连接起来 到目前为止 这是我的代码 func main create the reasons slice and append reasons to it reasons m
  • 指向函数中结构体数组的指针

    我的指针有问题 我想用一个函数读取一个二进制文件 然后在 main c 文件中使用读取的数据 问题是我必须传递一个指向结构数组的指针才能使用 main 中的数据 代码是 define TMOLDEO 8 define TAM 41 stru
  • GoLang - 坚持使用 ISO-8859-1 字符集

    我正在开发一个项目 我们需要将信息保存在具有 ISO 8859 1 表的旧数据库中 因此 在向数据库写入内容之前 我需要将其从 UTF 8 转换为 ISO 8859 1 每次从数据库检索它时 我都需要将其转换回 UTF 8 我试图使用图书馆
  • Bazel 构建缺少严格的依赖关系

    我正在尝试使用 brazel 构建 Go 应用程序 它是一个现有的私有 GitHub 存储库 位置如下 github xyz com repo name 我正在研究 我的目标是从 main go 文件创建一个二进制文件 该文件的方法依赖于其
  • 易失性结构=结构不可能,为什么?

    struct FOO int a int b int c volatile struct FOO foo int main void foo a 10 foo b 10 foo c 10 struct FOO test foo return
  • Go SQL查询不一致

    我在执行查询时遇到一些非常奇怪的不一致 并且想知道是否有人知道原因 想象一下我有一个定义如下的结构 type Result struct Afield string db A Bfield interface db B Cfield str

随机推荐

  • 对 eval() 的调用被 CSP 使用 Selenium IDE 阻止

    我开发了一个硒测试Selenium IDE 我在这个套件中有一个步骤 应该在文本字段中输入一个值 它在该步骤失败并给出以下错误 18 click on id firstName Failed 11 12 59 call to eval bl
  • C 中的二维数组初始化

    我知道这是一个老栗子 但我想要在我的代码中静态分配一个小的二维数组 我知道做到这一点的方法是 static int A 3 2 1 2 3 4 5 6 没关系 我可以访问它的所有成员 但是 我在将其传递给函数时遇到了几个问题 例如 void
  • 为什么“VolatileQualifiedExpr + VolatileQualifiedExpr”在C中不一定是UB,而在C++中却不一定是UB?

    当我今天读 C 标准时 它提到了副作用 访问易失性对象 修改对象 修改文件或调用函数 这些操作中的任何一个都是副作用 C 标准说 访问由易失性泛左值 3 10 指定的对象 修改对象 调用库 I O 函数或调用执行任何这些操作的函数都是副作用
  • Elastic beanstalk 上的 wsgi 用户权限

    我正在使用弹性豆茎和 django 我的requirements txt 文件中的一个依赖项有一些在最初导入时执行的设置 设置的一部分是检查目录是否存在 否则创建它 我收到权限错误 因为用户 我假设是 wsgi 没有创建目录的权限 OSEr
  • Python 中的快速简单的文件对话框?

    我有一个简单的脚本 它解析文件并将其内容加载到数据库中 我不需要 UI 但现在我提示用户使用以下命令解析文件raw input这是最不友好的 特别是因为用户无法复制 粘贴路径 我想要一种快速简便的方法来向用户呈现文件选择对话框 他们可以选择
  • ExpandableListView 组项上的 Android LongClickListener

    我在本教程的帮助下创建了一个 ExpandableListView link http blog csdn net avenleft article details 7192972 我或多或少地理解了代码 并尝试在组上设置一个 longcl
  • 如何知道事务方案何时可序列化?

    我正在研究SQL 需要知道某个事务方案是否可序列化 我理解确定这一点的方法是制作一个以事务作为节点和节点之间的方向的图 如果该图是循环的 则该方案不可序列化 但这是什么意思以及什么决定了图中是否存在从一笔交易到另一笔交易的有向边 在这种情况
  • USE_CREDENTIALS 在新的 Android M API 中不可用

    在尝试新的权限 API 时 值得注意的是 ActivityCompat checkSelfPermission ActivityCompat shouldShowRequestPermissionRationale ActivityComp
  • 从 C 创建一个实现 __dict__ 的 Python 类型?

    如何创建一个类型以具有 dict 按照 正常 类的说法 它是在 Python 中定义的吗 是否有任何非动态类型的示例 dict s 通过 Python 定义类型通过 有一个tp dict成员PyTypeObject 但我找不到有关如何使用它
  • 如何在根视图中隐藏导航控制器?

    请帮助我在根视图中隐藏导航控制器 我找到了写的解决方案 navigationController setNavigationBarHidden YES 在我需要的每个视图控制器中 好吧 它可以工作 但只是第一次 我运行应用程序 在根视图中我
  • JMSTemplate 检查主题是否存在并获取订阅者数量

    我一直在寻找一些文档 示例来检查动态创建的主题是否存在 如果存在 如何获取该主题的订阅者计数 我使用以下代码向主题发送消息 jmsTemplate send destination new MessageCreator Override p
  • 在不同数组中添加不同部分的选定单元格,UICollectionView

    我想添加选定的单元格UICollectionView在数组中 按部分划分在不同的数组中 意味着每个部分有不同的数组 问题是部分的数量是动态的 下面是我的代码 void collectionView UICollectionView coll
  • 关于纯头文件 C++ 库使用情况的可量化指标(基准)

    我试图用 SO 找到这个问题的答案 有很多问题列出了在 c 中构建仅头文件库的各种优缺点 但我还没有找到一个以可量化的方式做到这一点的问题 那么 从可量化的角度来看 使用传统上分离的 C 头文件和实现文件与仅使用头文件有什么不同 为简单起见
  • FlashDevelop - 为什么代码完成不适用于 mx.controls

    今天是我使用 Flex 和 FlashDevelop 的第一天 在我的 ActionScript 文件中 有这一行 import flash display SimpleButton FlashDevelop 意识到了这一点并且代码完成工作
  • Plone:升级 jQuery

    在 Plone 4 1 中使用 jQuery SlickGrid 插件并尝试调整网格列的大小会出错这个 jQuery 1 4 4 错误 http bugs jquery com ticket 7500 该问题已在较新的版本中得到修复 是否可
  • iOS 6 中 UIPickerView 选择行崩溃

    我的应用程序在 iOS 5 x 中完美构建和运行 但当我调用时它崩溃了selectRow inComponent animated 的方法UIPickerView在 iOS 6 中 code pickerview selectRow 1 i
  • 如何求这4个正方形的外角坐标? (如果图像旋转,形态闭/开不会保留正方形)

    我正在编码的工具中的第一个处理步骤是找到4个大黑色方块的外角坐标 然后 它们将用于进行单应变换 以便校正图像 取消旋转图像 也称为透视变换 最终获得矩形图像 这是 旋转和嘈杂 输入的示例 下载链接在这里 https i stack imgu
  • 邮差喷气背包 - 测试嵌套数据

    我在邮递员中进行了测试 并且响应返回了 嵌套 数据 我的意思是我们有响应的 数据 部分和 消息 部分 内部数据还有大量其他字段 这些字段是我需要使用 Jetpack 进行验证的字段 我怎样才能到达这些领域 JSON 响应如下所示 Data
  • Asp.net mvc 3 - 自定义模型绑定

    我有一个这样的模型 public string Name get set public IEnumerable
  • 意外返回匿名结构

    我正在尝试实现一种方法 该方法返回基于原始结构的修改后的结构 例如 type Project struct Username string Id uint Alias string Data json RawMessage Scheme S