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
你好,
你的第一个示例应该是:
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变量,每次调用返回的函数时都会递增并返回该值。这种方式实现了变量作用域的封装,每个闭包都有自己独立的作用域。

