Golang中的参数传递示例详解
作者:tomorrowwu 发布时间:2024-05-08 10:51:33
标签:golang,参数传递
前言
本文主要给大家介绍了关于Golang参数传递的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
关于参数传递,Golang文档中有这么一句:
after they are evaluated, the parameters of the call are passed by value to the
function and the called function begins execution.
函数调用参数均为值传递,不是指针传递或引用传递。经测试引申出来,当参数变量为指针或隐式指针类型,参数传递方式也是传值(指针本身的copy)
Slice是最常用的数据结构之一,下面以Slice为例,解释Golang的参数传递机制。
Slice数据结构如下:
示例代码:
package main
import "fmt"
func main(){
slice := make([]int, 3, 5)
fmt.Println("before:", slice)
changeSliceMember(slice)
fmt.Println("after:", slice)
}
func changeSliceMember(slice []int) {
if len(slice) > 1 {
slice[0] = 9
}
}
函数执行结果为:
befor:[0 0 0]
after:[9 0 0]
解释:
从数据结构图中可看出,Slice可以理解成结构体类型,包含底层数组首元素地址、数组len、容量三个字段,slice对象在参数传值过程中,把三个字段的值传递过去了,实际上changeSliceMember函数内slice在内存中的地址和main中的slice内存地址不一样,只是字段值是一样的,而第一个字段Pointer的值就是底层数组首元素地址,因此可以直接改变元素内容
可以与下面代码做对比,理解:
package main
func main() {
value := new(int)
modifyFunc(value)
println("main:", value)
}
func modifyFunc(value *int) {
value = nil
println("modifyFunc:", value)
}
执行结果:
modifyFunc: 0x0
main: 0xc820049f30
可以看出,即使传值为指针,仍未改变变量value在main中的值,因为modifyFunc中value的值为指针,和main中的value值一样,但是俩对象本身是两个对象,读者可以细细体会
来源:https://segmentfault.com/a/1190000011016198


猜你喜欢
- 随着软件项目进入“维护模式”,对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准)。然而,在代码库中保持一致的代码风格和测
- JDBC连接MySQL数据库关键的四个步骤1、查找驱动程序MySQL目前提供的Java驱动程序为Connection/J,可以从MySQL官
- 折线图介绍折线图和柱状图一样是我们日常可视化最多的一个图例,当然它的优势和适用场景相信大家肯定不陌生,要想快速的得出趋势,抓住趋势二字,就会
- 第一个保存在新建一个文本中<% Dim Username,PassWord,strLogFile,f,ff,Str
- 本文实例讲述了mysql中各种常见join连表查询。分享给大家供大家参考,具体如下:通常我们需要连接多个表查询数据,以获取想要的结果。一、连
- forma格式化的用法format函数可以接受不限个参数,位置可以不按顺序。基本语法是通过{ }和:来代替c语言的%。>>>
- declare @str varchar(100) set @str='8f8el3l' declare @s varcha
- 一、Pytorch创建张量的4种方法Pytorch创建张量的4种方法主要有:torch.Tensor()、torch.tensor()、to
- 简介Blade 是 Laravel 所提供的一个简单且强大的模板引擎。相较于其它知名的 PHP 模板引擎,Blade 并不会限制你必须得在视
- bootstrap前端开发工具栅格系统版心 .container栅格布局 (一行分为12格,响应式布局).row.col-md-12.col
- 本文实例讲述了Python面向对象实现一个对象调用另一个对象操作。分享给大家供大家参考,具体如下:我先总结一下python中的类的特点:1.
- 自己用python写了一个签到脚本,经过测试已经可以成功打卡,于是研究了一下windows定时运行程序1. 创建定时任务1.1 计划任务打开
- 在实际的项目中,能用别人写好的插件实现相关功能是最好不过,为了节约时间成本,因为有的项目比较紧急,没充分时间让你自己来写,即便写了,你还要花
- 延时摄影(英语:Time-lapse photography)是以一种较低的帧率拍 下图像或者视频,然后用正常或者较快的速率播放画面的摄影技
- 在windows下用python脚本实现文件的备份,参考《A Byte of Python3》第十一章(Page59)。#!/usr/bin
- file 对象使用 open 函数来创建,下表列出了 file 对象常用函数read、readline、readlines区别:1.从文件读
- 通过文件夹导入包要求每个目录下都有一个__init__.py文件,此文件可空白。也可不空。a@ubuntu:~/Desktop$ tree
- 相信互联网的从业者都有同一个顾虑,那就是怎样将自己网站的用户牢牢抓住。如果以用户的角度来讲,任何网站其实都是一样的,都是我获取东西、获取服务
- cookie:PHPSESSID=et4a33og7nbftv60j3v9m86cro; Hm_lvt_51e3cc975b346e7705
- 基础知识在关系型数据库中每一个数据表相当于一个文件,而不同的存储引擎则会构建出不同的表类型。存储引擎的作用是规定数据表如何存储数据,如何为存