go语言用指针查找成绩 golang指针

GO 一文搞懂指针和地址值的区别

go语言中的指针和地址值,在使用上常常具有迷惑性,主要是其特殊的*、符号的使用,可能会让你摸不透,本文希望能讲清楚go语言的指针(pointer)和值(value)。

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的大兴网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

这里先简单的对指针和地址值概念做一个定义:

这是因为go方法传递参数的方式导致的,go方法函数传递参数传递的是一个拷贝,看看下面的程序会输出什么?

答案是8,而不是9,因为AddAge函数修改的是学生的一个备份,而不是原始的学生对象

如果你想正确的给学生年龄增加的话,函数传递的需要是这个值的指针,如下所示:

需要注意的是,这里我们的指针传递的仍然是一个拷贝,比如,如果你将s赋值给另外一个指针地址,不会影响原有的指针,这点可以自行实践下。

那在使用go语言开发的时候,何时该用指针何时改用地址值呢?比如考虑以下场景:

简单原则: 当你不确定该使用哪种的时候,优先使用指针

如果考虑在数组、切片、map等复合对象中使用指针和值,比如:

很多开发者会认为b会更高效,但是被传递的都是一个切片的拷贝,切片本身就是一个引用,所以这里被传递的其实没有什么区别。

对于指针和地址值的使用,大家需要牢记的一点就是go数据传递的不可变性,活学活用此特点,在无状态函数中此特性非常有用。

设计查询学生信息的函数和学生成绩统计程序

基本原理和这个通讯录数据处理程序相似,提问者稍加修改就可以使用。

clear

set safe off

use txl

text

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

※ 1.输入 2.修改 3.插入 4.删除 ※

※ 5.按姓名升序显示 6.按邮政编码升序显示 ※

※ 7.按姓名查询 8.退出 ※

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

endtext

input "请按数字键选择" to aa

do case

case aa=1

go bott

accept "请输入姓名:" to xm

accept "请输入性别:" to xb

accept "请输入电话号码:" to dhhm

accept "请输入家庭住址:" to jtzz

accept "请输入工作单位:" to gzdw

accept "请输入邮政编码:" to yzbm

repl 姓名 with xm,性别 with xb, 电话号码 with dhhm,家庭住址 with jtzz,工作单位 with gzdw,邮政编码 with yzbm

case aa=2

input"请输入您要修改的记录的编号:" to c

go c

? "请修改第"+str(c,1)+"个人的数据!"

disp

accept "请输入姓名:" to xm

accept "请输入性别:" to xb

accept "请输入电话号码:" to dhhm

accept "请输入家庭住址:" to jtzz

accept "请输入工作单位:" to gzdw

accept "请输入邮政编码:" to yzbm

repl 姓名 with xm,性别 with xb, 电话号码 with dhhm,家庭住址 with jtzz,工作单位 with gzdw,邮政编码 with yzbm

case aa=3

append blank

accept "请输入姓名:" to xm

accept "请输入性别:" to xb

accept "请输入电话号码:" to dhhm

accept "请输入家庭住址:" to jtzz

accept "请输入工作单位:" to gzdw

accept "请输入邮政编码:" to yzbm

repl 姓名 with xm,性别 with xb, 电话号码 with dhhm,家庭住址 with jtzz,工作单位 with gzdw,邮政编码 with yzbm

case aa=4

input "请输入您想要删除的记录号" to d

go d

delete

accept "确认删除请按小写字母y,否则取消删除)" to e

if e="y"

pack

else

recall

endif

case aa=5

index on 姓名 to xm

list

case aa=6

index on 邮政编码 to yzbm

list

case aa=7

accept "请输入您要查询的姓名" to f

list for 姓名=f

case aa=8

wait "系统即将关闭" window timeout 3

exit

othe

messagebox("请重新选择",0+64,"出错了")

endc

set safe on

*这个程序能完成任务,不过界面不好。可以这样修改:

*新建一个表单(主表单,表单1),增加8个按钮,每个按钮的名称caption同上面程序中的菜单;再增加一个按钮,caption为“退出”,保存表单1。

*新建一个数据处理表单(表单2),向表单添加标签,caption为“姓名”,再增加一个文本控件text1,用来处理“姓名”数据;继续向表单添加标签,caption为“性别”,增加一个文本控件text2,用来处理“性别”数据;.........向表单添加标签,caption为“邮政编码”,再增加一个文本控件text6,用来处理“邮政编码”数据。把标签和文本控件适当整理齐整。增加一个按钮,caption 为“保存”,再增加一个按钮,caption为“退出”,

双击表单空白处,出现load事件,输入

thisform.text1.value=xm

thisform.text2.value=xb

thisform.text3.value=dhhm

thisform.text4.value=jtzz

thisform.text5.value=gzdw

thisform.text6.value=yzbm

输入完毕,关闭load事件,这是给表单2的几个控件赋初值。

双击“退出”按钮,输入

thisform.release

关闭事件,双击“保存”按钮,输入

repl 姓名 with thisform.text1.value,;

性别 with thisform.text2.value,;

电话号码 with thisform.text2.value,;

家庭住址 with thisform.text2.value,;

工作单位 with thisform.text2.value,;

邮政编码 with thisform.text2.value

保存表单2。

打开表单1,双击表单的空白处,出现load事件,输入:

set safe off

use txl

public xm,xb,dhhm,jtzz,gzdw,yzbm

双击“输入”按钮,输入

go bott

*下面给表单2赋初值

xm=姓名

xb=性别

dhhm=电话号码

jtzz=家庭住址

gzdw=工作单位

yzdm=邮政编码

do form 表单2

双击“修改”按钮,输入

input"请输入您要修改的记录的编号:" to c

go c

*下面给表单2赋初值

xm=姓名

xb=性别

dhhm=电话号码

jtzz=家庭住址

gzdw=工作单位

yzdm=邮政编码

do form 表单2

双击“插入”按钮,输入

appe blank

*下面给表单2赋初值

xm=姓名

xb=性别

dhhm=电话号码

jtzz=家庭住址

gzdw=工作单位

yzdm=邮政编码

do form 表单2

双击“删除”按钮,输入

input "请输入您想要删除的记录号" to d

go d

delete

accept "确认删除请按小写字母y,否则取消删除)" to e

if e="y"

pack

else

recall

endif

双击“按姓名升序显示”按钮,输入

index on 姓名 to xm

brow

双击“按邮政编码升序显示”按钮,输入

index on 邮政编码 to yzbm

brow

双击“按姓名查询”按钮,输入

accept "请输入您要查询的姓名" to f

brow for 姓名=f

双击“退出”按钮,输入

close data

set safe on

thisform.release

go语言中指针的使用场景?

如果该函数会修改receiver,此时一定要用指针

如果receiver是 struct 并且包含互斥类型 sync.Mutex ,或者是类似的同步变量,receiver必须是指针,这样可以避免对象拷贝

如果receiver是较大的 struct 或者 array ,使用指针则更加高效。多大才算大?假设struct内所有成员都要作为函数变量传进去,如果觉得这时数据太多,就是struct太大

如果receiver是 struct , array 或者 slice ,并且其中某个element指向了某个可变量,则这个时候receiver选指针会使代码的意图更加明显

如果receiver使较小的 struct 或者 array ,并且其变量都是些不变量、常量,例如 time.Time ,value receiver更加适合,因为value receiver可以减少需要回收的垃圾量。


文章标题:go语言用指针查找成绩 golang指针
分享链接:http://azwzsj.com/article/dojgegi.html