【问题标题】:Golang nested class inside functionGolang嵌套类在函数内
【发布时间】:2015-01-31 13:28:09
【问题描述】:

Go 支持函数内嵌套结构体,但除了 lambda 外没有嵌套函数,是不是意味着函数内无法定义嵌套类?

func f() {
    // nested struct Cls inside f
    type Cls struct {
    ...
    }
    // try bounding foo to Cls but fail
    func (c *Cls) foo() {
    ...
    }
}

所以类在函数内部被弱化感觉有点奇怪。

有什么提示吗?

【问题讨论】:

  • struct 是一个结构类型。 Go 没有课程。
  • @icza 抱歉上面的class 表示struct 具有边界功能。原谅我不正确的表达方式。
  • 是的,我明白了,我只是更正了术语或术语。

标签: go nested


【解决方案1】:

其实声明函数 withwithout 接收器都没有关系:Go 中不允许嵌套函数。

虽然你可以使用Function literals 来实现这样的目标:

func f() {
    foo := func(s string) {
        fmt.Println(s)
    }

    foo("Hello World!")
}

在这里,我们创建了一个变量foo,它有一个函数类型,它在另一个函数f 中被删除。按预期调用“外部”函数f 输出:"Hello World!"

试试Go Playground

【讨论】:

  • ok~ 有没有办法将函数文字绑定到嵌套的struct
  • @HayesPan 不,你不能。不是为该类型创建方法。您可以为函数文字指定一个附加参数,该参数将是 struct 类型的接收器,但它不会是 struct 方法集的一部分。 Function literal 不是 function,它只是一个 value(具有函数类型)。
  • 知道了√ 谢谢! @icza
  • 如果我想从内部递归调用这个字面量函数呢?
【解决方案2】:

我赞成 icza 的回答,但只是为了扩展一点,这是他的示例稍作修改,表明外部函数中定义的变量对内部函数是可见的:

    func f(s string) {
        foo := func() {
            fmt.Println(s)
        }

        foo()
    }

    func main() {
        f("Hello, World!\n")
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多