2359
- 收藏
- 点赞
- 分享
- 举报
Go语言中结构体初始化后,拿到结构体类型的普通对象(非指针类型)
调用其地址传递的方法后,居然仍然能实现增加和删除?不理解
Go语言结构体到底是什么传递
本周,拿go练习了数据结构中的单链队列,实现很简单,代码附在最后。
然而在测试到时候惊奇的发现,在InitQ函数中,我明明返回的是LinkQ类型,并没有在这个返回值设置对应的指针类型,而在main函数测试中,我反而拿这个LinkQ类型变量去调用了AddQ方法,而且居然还生效了,注意我AddQ的调用者设置的是指针类型(**LinkQ),
因为我们知道,Go语言中结构体是值传递,所以要想做改变其中成员操作的方法和函数参数,必然要做地址传递。
package main
import "fmt"
//实现单链队列,队尾入队,队头出队
//定义队列每个节点属性
type Qnode struct {
data interface{}
next *Qnode
}
//定义队列属性
type LinkQ struct{
head *Qnode //头指针
length int
}
func InitQ()_** LinkQ**_{
return LinkQ{
&Qnode{
0,
nil,
},
0,
}
}
func InitQnode(i interface{})*Qnode{
return &Qnode{
i,
nil,
}
}
func (q *LinkQ)AddQ(node *Qnode)bool{
p:=q.head
for i:=0;i<q.length;i++{
p=p.next
}
node.next=p.next
p.next=node
q.length++
return true
}
func (q *LinkQ)DelQ()bool{
if q.length==0 {
fmt.Println("队是空队列,无法删除")
return false
}
p:=q.head.next
q.head.next=p.next
p.next=nil
q.length--
return true
}
func(q LinkQ)Show()string{
if q.length==0{
return "表是空的"
}
p:=q.head.next
for i:=0;i<q.length;i++{
fmt.Printf("%v",p.data)
p=p.next
}
return "打印完毕"
}
func main() {
**//初始化队列,注意这里q应该只是LinkQ类型**
q:=InitQ()
//往队列里插入数据
for i:=0;i<7;i++{
n:=InitQnode(i)
** //居然可以调用AddQ并且生效了**
q.AddQ(n)
}
fmt.Println(q.Show())
q.DelQ()
q.DelQ()
q.DelQ()
fmt.Println(q.Show())
}
结果:
0123456打印完毕
3456打印完毕
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2010-07-23 16:56:24
-
2020-12-03 16:41:00
-
2021-05-08 14:49:58
-
2021-05-08 15:02:50
-
2022-05-27 11:15:24
-
2019-08-01 21:03:59
-
2018-11-21 14:27:10
-
2016-08-26 12:02:21
-
2018-11-06 09:24:31
-
2020-11-22 16:19:40
-
2016-03-07 10:35:26
-
2014-11-21 14:38:02
-
2014-11-21 14:44:08
-
2019-12-16 11:47:43
-
02020-11-17 19:07:23
-
2019-01-29 14:05:59
-
2020-11-25 09:17:23
-
2018-12-17 11:31:24
-
2020-11-12 16:16:13
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认