type DataNode struct{
cmd *string
desc *string
handler func() int
next *DataNode
}
var head = []DataNode{
{cmd:"help", desc:"cmd tips", handler:help, next:&head[1]},
{cmd:"add", desc:"addition of two numbers", handler:add, next:nil}}
func main(){
//head[0].next = &head[1]
//head[1].next = &head[2]
//head[2].next = nil
......
}
如果在main中初始化next,则报错如下:
.\menu2.go:18:initialization loop:
E:\Go_WorkSpace\lab3\main\menu2.go:18 head refers to
E:\Go_WorkSpace\lab3\main\menu2.go:18 help refers to
E:\Go_WorkSpace\lab3\main\menu2.go:18 head
如果在{}中初始化next,出错如下:
.\menu2.go:18:typechecking loop involving head = []DataNode literal
E:\Go_WorkSpace\lab3\main\menu2.go:18 head
E:\Go_WorkSpace\lab3\main\menu2.go:18 head[1]
E:\Go_WorkSpace\lab3\main\menu2.go:18 &head[1]
E:\Go_WorkSpace\lab3\main\menu2.go:18 composite literal
E:\Go_WorkSpace\lab3\main\menu2.go:18 []DataNode literal
第二种错误可能如6楼所说,go语言在我这种方式构造的时候参数值必须是基本类型,要是自定的Struts是不能这样直接在构造里面写的,但是我在main中定义有会报第一种错误。
请各位Go友帮忙解决下这个问题~~~
你好,我尝试了你的解决办法,代码如下:
package main
import (
"fmt"
)
type DataNode struct{
cmd string
desc string
handler *func()int
next *DataNode
}
var head = [] DataNode{}
{
{cmd:"help", desc:"cmd tips", handler:&help, &head[1]},
{cmd:"add", desc:"addition of two numbers", handler:&add, &head[2]}
}
func main(){
for true{
cmd *string
fmt.Printf("Input a command > ")
fmt.Scanf("%s\n", cmd)
p := FindCmd(head, cmd) *tDataNode
if p == nil{
fmt.Printf("This is a wrong cmd!\n")
continue;
}
fmt.Printf("%s - %s\n", p.cmd, p.desc)
if p.handler != nil {
p.handler()
}
}
return 0
}
func help() int{
ShowAllCmd(head)
return 0
}
func add() int{
var num1, num2, add float64
fmt.Printf("+-------*--------*--------*--------*-------+\n")
fmt.Printf("Addition!\nplease input two numbers:\n")
fmt.Scanf("%f %f\n", &num1, &num2)
add = num1 + num2
fmt.Printf("%f + %f = %f\n", num1, num2, add)
return 0
}
但是报了错误如下:
.\menu2.go:30: cannot take the address of help
.\menu2.go:34: cannot take the address of add
#5
更多评论
你好,谢谢你的回答。是这样的,在结构体中,我定义handler是一个指向函数的指针变量,cmd是指向控制台输入的命令的指针变量。根据cmd值的不同,程序将不同的函数地址赋给handler。在c中,可以这么定义,int (*handler)(),但是我不知道怎么用go实现同样的功能,你知道吗?谢谢。
#2