Golang实战练习:创建一个封装变量作用域的func

Golang实战练习:创建一个封装变量作用域的func https://play.golang.org/p/ceO6iMgUo43

他们说的"期望表达式"是什么意思?定义函数有什么问题吗?这就是我试图在那里做的事情

5 回复

我能否,换句话说,扩展这个代码 使其输出: 1 2 3 4

更多关于Golang实战练习:创建一个封装变量作用域的func的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


第二次尝试:

https://play.golang.org/p/1ElNBeftv9i

这到底是怎么回事?

你好,

你的第一个示例应该是:

package main

import (
	"fmt"
)

func main() {
	z := StanleyCup()
	fmt.Println(z()) // 这里需要调用函数。
}

func StanleyCup() func() string {
	var p string
	return func() string {
		fmt.Println("No Blackhawks")
		return p
	}
}

在你的第二个示例中,你也需要调用函数,例如:

fmt.Println(m())

好的,根据你第一个例子中的解释,我做了这个: https://play.golang.org/p/Znzj2pytZUd

我在你代码中看到的区别是

fmt.Println(z())

我在格式化时仍然收到错误信息。 我漏掉了什么?

在第二个例子中,我搞定了! https://play.golang.org/p/5OT1BvKZDrc

谢谢!

在Go语言中,函数定义不能出现在其他函数内部作为表达式使用,这会导致"expected expression"错误。你提供的代码试图在main函数内部定义另一个函数,这在Go中是不允许的。

以下是正确的做法:

package main

import "fmt"

// 在包级别定义函数
func createCounter() func() int {
    count := 0 // 这个变量被封装在闭包的作用域中
    return func() int {
        count++
        return count
    }
}

func main() {
    // 正确的方式:调用函数返回闭包
    counter := createCounter()
    
    fmt.Println(counter()) // 输出: 1
    fmt.Println(counter()) // 输出: 2
    fmt.Println(counter()) // 输出: 3
    
    // 创建另一个独立的计数器
    anotherCounter := createCounter()
    fmt.Println(anotherCounter()) // 输出: 1
}

或者,如果你想要在函数内部使用函数表达式,可以使用函数字面量:

package main

import "fmt"

func main() {
    // 使用函数字面量(匿名函数)
    createCounter := func() func() int {
        count := 0
        return func() int {
            count++
            return count
        }
    }
    
    counter := createCounter()
    fmt.Println(counter()) // 输出: 1
    fmt.Println(counter()) // 输出: 2
}

在第一个示例中,createCounter函数返回一个闭包,该闭包封装了count变量,每次调用返回的函数时都会递增并返回该值。这种方式实现了变量作用域的封装,每个闭包都有自己独立的作用域。

回到顶部