Golang回调函数练习与代码分享:https://play.golang.org/p/7AH5xa2w-2c

Golang回调函数练习与代码分享:https://play.golang.org/p/7AH5xa2w-2c https://play.golang.org/p/7AH5xa2w-2c

当我格式化这段代码时,提示“期望表达式”。他们到底想要什么表达式?

https://play.golang.org/p/6MlEdlkgFwb 我发现了一个错误并修复了它。 现在又提示“参数列表中缺少逗号”。我不知道他们想在哪个位置加逗号。 仍在努力解决中。 https://play.golang.org/p/uMFXAcFuX0Z 运行代码时出现以下错误: “prog.go:9:71: 语法错误:意外的int,期望逗号或右括号 prog.go:11:2: 语法错误:语句末尾出现意外的for prog.go:18:6: 语法错误:意外的yearlyincrease,期望左括号 prog.go:23:1: 语法错误:函数体外出现非声明语句” 这些错误信息对我来说完全是个谜。


更多关于Golang回调函数练习与代码分享:https://play.golang.org/p/7AH5xa2w-2c的实战教程也可以访问 https://www.itying.com/category-94-b0.html

21 回复

不,他没有。他只是将其用作类型。

更多关于Golang回调函数练习与代码分享:https://play.golang.org/p/7AH5xa2w-2c的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢 🙏。明天继续。时间不够了 😕。

我难道没有以同样的方式使用"incomeforthe nextfouryears"作为类型吗?

问题的解答似乎引发了更多疑问。我会继续努力研究。时间有限。感谢您的耐心帮助。

cherilexvold1974:

那么"printInt"是类型名称吗?而"func(int)"是类型?

正确。

GreyShatter:

不要一次性改变所有事情。一次改变,一次成功。

我不明白你在这里指的是什么。

阅读工具告诉你的内容。

什么工具?我不知道工具是什么。

你在这行代码中具体想要实现什么功能?

fmt.Println(incomeforthenextfouryears(func() yearlyincrease, int)(int)int{

让我重新开始。这个练习的目标是实践回调功能……“将一个函数作为参数传递给另一个函数”。

我的想法是创建一个函数,列出几个年份(2019-2023),然后传入一个函数来计算年度增长(我设想从40,000开始,每年增加1000)。尝试这样的做法有意义吗?

好问题,对吧?哈哈

嗯,最终目标是"将一个函数作为参数传递给另一个函数"。

所以我想要打印2019到2024年之间的每一年,并为每一年显示1000的增长量。我尝试创建一个函数来计算增长量,然后在列出每一年时调用该函数。我是否可以使用回调来实现这个目标呢?

你不能在另一个函数内部创建命名函数。你必须创建一个匿名函数并将其赋值给一个变量。这就是你收到该错误的原因。

file.go:11:6 表示在文件 file.go 的第 11 行,第 6 列。但请注意,使用 TAB 缩进时,每个 TAB 计为一列。

cherilexvold1974:

定义类型的目的是什么?

为了简化理解[如果你是初学者]或提高可读性[如果你更有经验]。

不错,只是有几个建议:

  1. 不要一次性修改所有内容。一次修改 - 一次成功。
  2. 仔细阅读工具提示的内容。

已修复:https://play.golang.org/p/PHODb5FUY-B

请多包涵。 你的代码:https://play.golang.org/p/PHODb5FUY-B 我的代码:https://play.golang.org/p/ZegcfjAzHT5 请忽略我的注释。 为什么我在格式化时收到这个错误信息:“prog.go:11:6: expected ‘(’, found test (and 1 more errors)”? 顺便问一下,11:6是什么意思?我明白11这部分;但对6感到困惑。

定义类型的目的是什么? 这样写看起来如何? type yearlyincrease func(int) 尝试应用到我的程序中。

func test(arg printInt) {
     for i := 0; i < 5; i++ {
 	    arg(i)
     }
 }

出现了错误:“prog.go:14:6: expected ‘(’, found test (and 2 more errors)” 查看或忽略并继续你正在做的事情:

https://play.golang.org/p/mpj3l9vES1M

很高兴再次收到你的回复。

NobbZ: 你不能在另一个函数内部创建命名函数。必须创建一个匿名函数并将其赋值给变量。这就是你收到该错误的原因。

那么"incomeforthenextfouryears"就是你提到的命名函数吗?那位绅士使用的"printInt"不就是一个命名函数吗?

func main() {
    printInt := func(i int) {
        fmt.Println(i)
    }
    printInt(42)
}

cherilexvold1974:

我不明白你在这里指的是什么。

嗯…每个程序都从某个模板开始编写。如果你采用增量式编写代码而非复制粘贴的方式,一次不会遇到太多编译错误。对吧? 编译时错误属于基础级别,只需查阅文档的主页/包中的示例/…最后快速谷歌搜索就能解决。

cherilexvold1974:

我不知道什么是工具。

编译器、代码检查工具、应用程序。

GreyShatter的代码

他在使用"printInt"的地方,与我在这个代码中使用"incomeforthe nextfouryears"的位置完全相同。

但我却收到错误信息:“prog.go:11:6: expected ‘(’, found test (and 1 more errors)”

我遗漏了什么?

哪位先生在什么地方使用了 printInt

我快速浏览后唯一能找到的 printInt 引用是在回调练习…再次尝试 https://play.golang.org/p/7AH5xa2w-2c中,而那里它是一个类型名称。

类型名称既不是命名函数也不是匿名函数。它只是一个类型,虽然类型可以用来描述命名或未命名函数(如果它们属于 func 类型)。

当然。但让我们回到你的目标——将函数作为参数传递给另一个函数。

  1. 定义参数的类型,例如这样: type printInt func(int) 因为函数也只是一个类型。

  2. 编写一个参数类型为 printInt 的函数,并在内部使用它

     func test(arg printInt) {
         for i := 0; i < 5; i++ {
     	    arg(i)
         }
     }
    
  3. 创建一个 printInt 类型的变量(就像其他类型一样):

     var f printInt = func(p int) {
     	    fmt.Println(p)
         }
    
  4. 调用它 test(f)

就这样。完整示例 - https://play.golang.org/p/Hkf0Da2xO-B

酷。

来自语言规范。

类型决定了一组值以及与这些值相关的操作和方法。类型可以通过类型名称(如果有的话)来表示,或者使用类型字面量来指定,类型字面量从现有类型组合而成。

类型 = 类型名称 | 类型字面量 | “(” 类型 “)” 。
类型名称 = 标识符 | 限定标识符
类型字面量 = 数组类型 | 结构体类型 | 指针类型 | 函数类型 | 接口类型 | 切片类型 | 映射类型 | 通道类型

type printInt func(int)

那么 “printInt” 是类型名称吗?而 “func(int)” 是类型吗?

你的代码中存在几个语法错误,主要问题在于函数声明和调用时的参数列表格式不正确。让我逐一分析并提供修复后的代码:

主要问题分析:

  1. 函数声明语法错误yearlyincrease 函数的参数列表格式不正确
  2. 函数调用语法错误:调用 yearlyincrease 时参数传递方式错误
  3. 语句位置错误:在函数体外出现了执行语句

修复后的代码:

package main

import "fmt"

// 修复函数声明 - 添加了正确的参数列表
func yearlyincrease(salary float64, increase float64) float64 {
    return salary + (salary * increase / 100)
}

func main() {
    salary := 1000.0
    
    // 修复函数调用 - 使用正确的参数传递方式
    for i := 1; i <= 5; i++ {
        newsalary := yearlyincrease(salary, 10.0)
        fmt.Printf("Year %d: %.2f\n", i, newsalary)
        salary = newsalary
    }
}

关键修复点:

  1. 函数参数列表

    // 错误
    func yearlyincrease(salary float64 increase float64) float64
    
    // 正确
    func yearlyincrease(salary float64, increase float64) float64
    
  2. 函数调用

    // 错误
    yearlyincrease(salary 10.0)
    
    // 正确
    yearlyincrease(salary, 10.0)
    
  3. 语句位置:所有执行语句必须放在函数内部(如 main 函数中)

运行结果:

代码现在可以正常编译运行,输出每年工资增长情况:

Year 1: 1100.00
Year 2: 1210.00
Year 3: 1331.00
Year 4: 1464.10
Year 5: 1610.51

这些语法错误是Go语言编译器的标准错误提示,熟悉后就能快速识别和修复。

回到顶部