新问题:Go语言怎么初始化结构体类型数组中的指针类型呢?(原问题:Go语言怎么在结构体中定义一个指向函数的指针呢?)

yelingyun · 2017-05-04 09:33:25 · 3581 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-05-04 09:33:25 的主题,其中的信息可能已经有所发展或是发生改变。

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友帮忙解决下这个问题~~~


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3581 次点击  
加入收藏 微博
14 回复  |  直到 2017-05-05 11:32:10
soou
soou · #1 · 8年之前

func(*DataNode) next (){} 这样不好吗?

yelingyun
yelingyun · #2 · 8年之前
soousoou #1 回复

func(*DataNode) next (){} 这样不好吗?

你好,谢谢你的回答。是这样的,在结构体中,我定义handler是一个指向函数的指针变量,cmd是指向控制台输入的命令的指针变量。根据cmd值的不同,程序将不同的函数地址赋给handler。在c中,可以这么定义,int (*handler)(),但是我不知道怎么用go实现同样的功能,你知道吗?谢谢。

larstos
larstos · #3 · 8年之前

funcs *func()int

赋值的时候 funcs=&try

func try()int{ return }

这样就行了吧

go_from_sz
go_from_sz · #4 · 8年之前

handle func()int就OK啦。 赋值的时候直接handle=xxx(自定义函数名); 楼上@larstos说的,有语法错误。cannot take the address of try.可以试试。把函数名本身理解成地址。

yelingyun
yelingyun · #5 · 8年之前
larstoslarstos #3 回复

funcs *func()int 赋值的时候 funcs=&try func try()int{ return } 这样就行了吧

你好,我尝试了你的解决办法,代码如下: 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

yelingyun
yelingyun · #6 · 8年之前
go_from_szgo_from_sz #4 回复

handle func()int就OK啦。 赋值的时候直接handle=xxx(自定义函数名); 楼上@larstos说的,有语法错误。cannot take the address of try.可以试试。把函数名本身理解成地址。

你好,谢谢你的回答,我尝试了你提供的解决办法,代码如下: var head = [] DataNode{ {cmd:"help", desc:"cmd tips", handler:help, &head[1]}, {cmd:"add", desc:"addition of two numbers", handler:add, &head[2]}} 但是报了以下的错误: .\menu2.go:16: mixture of field:value and value initializers .\menu2.go:17: mixture of field:value and value initializers

go_from_sz
go_from_sz · #7 · 8年之前
yelingyunyelingyun #6 回复

#4楼 @go_from_sz 你好,谢谢你的回答,我尝试了你提供的解决办法,代码如下: var head = [] DataNode{ {cmd:"help", desc:"cmd tips", handler:help, &head[1]}, {cmd:"add", desc:"addition of two numbers", handler:add, &head[2]}} 但是报了以下的错误: .\menu2.go:16: mixture of field:value and value initializers .\menu2.go:17: mixture of field:value and value initializers

你这个已经不是函数指针的错误了,是那个&head[1],感觉这里好奇怪。你那时候head都没初始化好呢。

larstos
larstos · #8 · 8年之前
go_from_szgo_from_sz #4 回复

handle func()int就OK啦。 赋值的时候直接handle=xxx(自定义函数名); 楼上@larstos说的,有语法错误。cannot take the address of try.可以试试。把函数名本身理解成地址。

-0-没跑test 尴尬

larstos
larstos · #9 · 8年之前
yelingyunyelingyun #6 回复

#4楼 @go_from_sz 你好,谢谢你的回答,我尝试了你提供的解决办法,代码如下: var head = [] DataNode{ {cmd:"help", desc:"cmd tips", handler:help, &head[1]}, {cmd:"add", desc:"addition of two numbers", handler:add, &head[2]}} 但是报了以下的错误: .\menu2.go:16: mixture of field:value and value initializers .\menu2.go:17: mixture of field:value and value initializers

go语言在你这种方式构造的时候参数值必须是基本类型,要是自定的Struts是不能这样直接在构造里面写的。<br/> var head = [] DataNode{ {cmd:"help", desc:"cmd tips", handler:help}}<br/> head[0].next=&head[1]

yelingyun
yelingyun · #10 · 8年之前
larstoslarstos #9 回复

#6楼 @yelingyun go语言在你这种方式构造的时候参数值必须是基本类型,要是自定的Struts是不能这样直接在构造里面写的。
var head = [] DataNode{ {cmd:"help", desc:"cmd tips", handler:help}}
head[0].next=&head[1]

你好,谢谢你的回答。我定义的head是一个全局变量,如果没有指定next的值,他会报错,没有指向。 代码如下: var head = []DataNode{ {cmd:"help", desc:"cmd tips", handler:help}, {cmd:"add", desc:"addition of two numbers", handler:add}}

func main(){ head[0].next = &head[1] head[1].next = &head[2] head[2].next = nil ....... }

出错内容如下: .\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

yelingyun
yelingyun · #11 · 8年之前
yelingyunyelingyun #10 回复

#9楼 @larstos 你好,谢谢你的回答。我定义的head是一个全局变量,如果没有指定next的值,他会报错,没有指向。 代码如下: var head = []DataNode{ {cmd:"help", desc:"cmd tips", handler:help}, {cmd:"add", desc:"addition of two numbers", handler:add}} func main(){ head[0].next = &head[1] head[1].next = &head[2] head[2].next = nil ....... } 出错内容如下: .\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

有个地方贴错了,代码如下: var head = []DataNode{ {cmd:"help", desc:"cmd tips", handler:help}, {cmd:"add", desc:"addition of two numbers", handler:add}}

func main(){ head[0].next = &head[1] head[1].next = nil ....... }

出错内容如下: .\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

yelingyun
yelingyun · #12 · 8年之前
go_from_szgo_from_sz #7 回复

#6楼 @yelingyun 你这个已经不是函数指针的错误了,是那个&head[1],感觉这里好奇怪。你那时候head都没初始化好呢。

我忘记加了next:,6楼说自定义类型需要单独赋值,可是这样会报没有初始化指向的错误。

go_from_sz
go_from_sz · #13 · 8年之前

我没有用过这样的,其实按理解你想搞一个单向链表,可是这是个slice啊,目的?要不你就初始化成nil,然后在循环赋值。

yelingyun
yelingyun · #14 · 8年之前

后来我改数组用单链表了,数组加结构体比较麻烦,调试成功了。代码如下:

type DataNode struct{ cmd string desc string handler func()int next *DataNode }

var head = DataNode{} var head0 = DataNode{} var head1 = DataNode{}

func main(){

head.next = &head0

head0.cmd = "help"
head0.desc = "cmd tips"
head0.handler = help
head0.next = &head1

head1.cmd = "add"
head1.desc = "addition of two numbers"
head1.handler = add
head1.next = nil

...... }

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传