博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang中的函数参数为指针
阅读量:3986 次
发布时间:2019-05-24

本文共 1048 字,大约阅读时间需要 3 分钟。

要实现一个这样的函数 GetOne

func main() {
var oi OrderInfo GetOne(&oi) fmt.Println(oi)}type OrderInfo struct {
Id string Price float64 Status int}func GetOne(orderInfo *OrderInfo) {
}

传入一个指针作为 GetOne 的参数,然后在函数内给这个指针变量设置值。

正确的写法应该是这样的:

func GetOne(orderInfo *OrderInfo) {
*orderInfo = OrderInfo{
Id: "aaaa", Price: 100.00, Status: 1, }}

错误的写法,oi 变量是空值:

func GetOne(orderInfo *OrderInfo) {
orderInfo = &OrderInfo{
Id: "aaaa", Price: 100.00, Status: 1, }}

其实一个很好的判断标准就是传入的地址和传出的地址是否发生变化,如果地址不一样了,那自然就无法给它赋值了。

// 传入fmt.Printf("%p\n", &oi) // 0xc0000044a0// 方法一*orderInfo = OrderInfo{
Id: "aaaa", Price: 100.00, Status: 1,}fmt.Printf("%p\n", orderInfo) // 0xc0000044a0fmt.Println(orderInfo) // &{aaaa 100 1}// 方法二orderInfo = &OrderInfo{
Id: "aaaa", Price: 100.00, Status: 1,}fmt.Printf("%p\n", orderInfo) // 0xc0000044e0fmt.Println(orderInfo) // &{aaaa 100 1}

可见方法二的 orderInfo 地址发生了变化,因此无法给引用赋值。

形参 orderInfo 存储的是一个地址p,而 *orderInfo 表示访问p指向的内存中的值,改变这个值就改变了实参的实际内容,达到了赋值的效果。但是方法二是改变了 orderInfo 的值,于是它指向了一个新的地址,就和实参没什么关系了。

转载地址:http://xjaui.baihongyu.com/

你可能感兴趣的文章
No.176 - LeetCode1309
查看>>
No.177 - LeetCode1310
查看>>
No.178 - LeetCode1311
查看>>
Mac:终端实用快捷键
查看>>
FE:http状态码
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
No.183 - LeetCode1324
查看>>
mac:移动python包路径
查看>>
No.221 - LeetCode[81] Search in Rotated Sorted Array II - 有重复元素单调数组截断后的二分
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql alter table修改表的字符集
查看>>
mysql:sql alter table 修改列属性的字符集
查看>>
mysql:sql drop database 删除数据库
查看>>
mysql:sql character set utf8mb4 新建utf8mb4表
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
mysql:sql order by */* desc (查询)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>
No.29 - POJ3422 最小费用最大流
查看>>