gpt4 book ai didi

struct - 匿名结构的意外返回

转载 作者:IT王子 更新时间:2023-10-29 00:37:44 26 4
gpt4 key购买 nike

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

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
}

这个语法不是你想的那样:它不包含结构定义。基本上在您的示例中,第一个 { 是匿名结构定义的左括号,不是 函数体的左括号。因此,随后的 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())

输出(在 Go Playground 上试试这些):

&{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())

输出(在 Go Playground 上试试这个):

{1 bobie <nil> <nil>}

注意:

嵌入并不是必需的,但是嵌入类型(BaseProject)的字段将被提升,因此您可以像 p.Id 一样引用它们如果它们是在 Project 中定义的。将其定义为常规字段也可以。

关于struct - 匿名结构的意外返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33831454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com