当前位置: 首页 > news >正文

网站建设 上海百度网盘app下载

网站建设 上海,百度网盘app下载,昆明网站制作报价,没有网站可以做京东联盟吗先说下结论 Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。 值语义类型:参数传递的时候,就是值拷贝,这样就在函数中就无法修改原内容数据。 基本类型:byte、int、bool…

先说下结论

Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。

  • 值语义类型:参数传递的时候,就是值拷贝,这样就在函数中就无法修改原内容数据。

    • 基本类型:byte、int、bool、float32、float64、string等;
    • 复合类型:array、struct和指针等
  • 引用语义类型:参数传递的时候,也是值拷贝,不过是这样就可以修改原内容数据。

    • map、slice、chan和接口

引用类型值传递图解

下图以 slice 为例,说明引用类型的变量作为实参传递给函数形参时是值传递(拷贝):

在这里插入图片描述

在Go语言里,虽然只有传值,但是我们也可以修改原内容数据,因为参数是引用类型,在函数传递引用类型的变量时,会如上图进行值拷贝,拷贝的数据里有引用变量引用的数据的地址。

值语义类型的参数传递

package mainimport "fmt"func main() {var by byte = 123var i int64 = 10var boolean bool = falsevar f32 float32 = 3.14var f64 float64 = 3.1415926var str string = "hello world"fmt.Printf("mian 函数中的变量 by 的内存地址是 %p\n", &by)fmt.Printf("mian 函数中的变量 i 的内存地址是 %p\n", &i)fmt.Printf("mian 函数中的变量 boolean 的内存地址是 %p\n", &boolean)fmt.Printf("mian 函数中的变量 f32 的内存地址是 %p\n", &f32)fmt.Printf("mian 函数中的变量 f64 的内存地址是 %p\n", &f64)fmt.Printf("mian 函数中的变量 str 的内存地址是 %p\n", &str)fmt.Println("=======================函数调用前=============")callByValue(by, i, boolean, f32, f64, str)fmt.Println("=======================函数调用后=============")fmt.Printf("被调函数中修改形参的值,main 函数中打印结果为(不变): %v\n", by)fmt.Printf("被调函数中打印结果为:%v\n", i)fmt.Printf("被调函数中打印结果为:%v\n", boolean)fmt.Printf("被调函数中打印结果为:%v\n", f32)fmt.Printf("被调函数中打印结果为:%v\n", f64)fmt.Printf("被调函数中打印结果为:%v\n", str)
}func callByValue(by byte, i int64, boolean bool, f32 float32, f64 float64, str string) {fmt.Printf("被调函数中,形参的 by 内存地址是:%p\n", &by)fmt.Printf("被调函数中,形参的 i 内存地址是:%p\n", &i)fmt.Printf("被调函数中,形参的 boolean 内存地址是:%p\n", &boolean)fmt.Printf("被调函数中,形参的 f32 内存地址是:%p\n", &f32)fmt.Printf("被调函数中,形参的 f64 内存地址是:%p\n", &f64)fmt.Printf("被调函数中,形参的 str 内存地址是:%p\n", &str)by = 10i = 20boolean = truef32 = 13.14f64 = 13.146666str = "hello golang"
}
mian 函数中的变量 by 的内存地址是 0xc00010200a , 值为: 123
mian 函数中的变量 i 的内存地址是 0xc000102020 , 值为: 10
mian 函数中的变量 boolean 的内存地址是 0xc000102028 , 值为: false
mian 函数中的变量 f32 的内存地址是 0xc00010202c , 值为: 3.14
mian 函数中的变量 f64 的内存地址是 0xc000102030 , 值为: 3.1415926
mian 函数中的变量 str 的内存地址是 0xc000104140 , 值为: hello world
=======================函数调用前=============
被调函数中,形参的 by 内存地址是:0xc000102048 ,值为:123 
被调函数中,形参的 i 内存地址是:0xc000102050 ,值为:10 
被调函数中,形参的 boolean 内存地址是:0xc000102058 ,值为:false 
被调函数中,形参的 f32 内存地址是:0xc00010205c ,值为:3.14 
被调函数中,形参的 f64 内存地址是:0xc000102060 ,值为:3.1415926 
被调函数中,形参的 str 内存地址是:0xc000104160 ,值为:hello world 
=======================函数内部修改值=============
=======================函数调用后=============
被调函数中修改形参的值,main 函数中打印结果为(不变): 123
被调函数中打印结果为:10
被调函数中打印结果为:false
被调函数中打印结果为:3.14
被调函数中打印结果为:3.1415926
被调函数中打印结果为:hello world

从日志中可以发现:main 函数实参的地址和被调函数callByValue中形参的地址不同,在被调函数中修改形参的值并不会 影响实参变量的值。

指针类型

形参和实际参数内存地址不一样,证明是值传递。由于形参和实参是指针类型,指向同一个变量,函数内对指针指向变量的修改,会修改原内容数据。

package mainimport "fmt"func main() {var i int64 = 1fmt.Printf("main 函数中 i 内存地址是 %p\n", &i)     //0xc000104020 ip := &icallByPointer(ip)fmt.Printf("改动后的值是: %v\n", i)
}func callByPointer(ip *int64) { //这里定义的args就是形式参数fmt.Printf("callByPointer形参的内存地址是:%p\n", &ip) //0xc000108068fmt.Printf("callByPointer形参的值是:%p\n", ip)       //0xc000104020*ip = 10 //解引用
}
main 函数中 i 内存地址是 0xc000104020 
callByPointer形参的内存地址是:0xc000108068
callByPointer形参的值是:0xc000104020
改动后的值是: 10

引用语义类型变量的参数传递

package mainimport "fmt"func main() {//切片var s = make([]int64, 5, 10)s[0] = 1s[1] = 2s[2] = 3s[3] = 4s[4] = 5fmt.Printf("原始切片 len %v ,cap %v", len(s), cap(s))var p = &sfmt.Printf("原始切片   取地址(&s):%p ; \n直接对原始切片取地址( p):%p \n", &s, p)fmt.Printf("原始切片   底层数组的内存地址(s):     %p  \n原始切片   第一个元素的内存地址(&s[0]): %p\n", s, &s[0])callBySliceParam(s)fmt.Printf("改动后的值是: %v\n", s)
}func callBySliceParam(s1 []int64) {fmt.Printf("函数里,函数参数(切片)取地址 %p\n", &s1)fmt.Printf("函数里,函数参数(切片)的底层数组的内存地址是 %p \n", s1)fmt.Printf("函数里,函数参数(切片)第一个元素的内存地址: %p \n", &s1[0])s1[0] = 10
}
原始切片 len 5 ,cap 10原始切片   取地址(&s):0xc0001120a8 ; 
直接对原始切片取地址( p):0xc0001120a8 
原始切片   底层数组的内存地址(s):     0xc00012c000  
原始切片   第一个元素的内存地址(&s[0]): 0xc00012c000
函数里,函数参数(切片)取地址 0xc0001120d8
函数里,函数参数(切片)的底层数组的内存地址是 0xc00012c000 
函数里,函数参数(切片)第一个元素的内存地址: 0xc00012c000 
改动后的值是: [10 2 3 4 5]

通过输出日志,可以清楚地看到切片作为引用类型的特点:传递切片时,实际上是传递了切片的副本,但这个副本仍然指向同一个底层数组。因此,对切片的修改会影响到原始切片。


文章转载自:
http://rimmon.qrqg.cn
http://cracky.qrqg.cn
http://lansign.qrqg.cn
http://gruff.qrqg.cn
http://foundling.qrqg.cn
http://unsaleable.qrqg.cn
http://retrospective.qrqg.cn
http://propitiatory.qrqg.cn
http://struggle.qrqg.cn
http://defence.qrqg.cn
http://masterpiece.qrqg.cn
http://antihistaminic.qrqg.cn
http://chanteuse.qrqg.cn
http://samarskite.qrqg.cn
http://gambia.qrqg.cn
http://adjuratory.qrqg.cn
http://gastrotrichan.qrqg.cn
http://butternut.qrqg.cn
http://huge.qrqg.cn
http://vasotomy.qrqg.cn
http://trinity.qrqg.cn
http://chellian.qrqg.cn
http://rejigger.qrqg.cn
http://sextus.qrqg.cn
http://hirsute.qrqg.cn
http://shopwoman.qrqg.cn
http://tremella.qrqg.cn
http://generitype.qrqg.cn
http://apiaceous.qrqg.cn
http://duodenostomy.qrqg.cn
http://unamiable.qrqg.cn
http://jeering.qrqg.cn
http://advisement.qrqg.cn
http://enamel.qrqg.cn
http://commentator.qrqg.cn
http://deregulate.qrqg.cn
http://disadvise.qrqg.cn
http://symbiote.qrqg.cn
http://haematoblast.qrqg.cn
http://ernie.qrqg.cn
http://tinnient.qrqg.cn
http://yourself.qrqg.cn
http://bootleg.qrqg.cn
http://facular.qrqg.cn
http://disclimax.qrqg.cn
http://lagena.qrqg.cn
http://ramon.qrqg.cn
http://curial.qrqg.cn
http://ozonesonde.qrqg.cn
http://malleate.qrqg.cn
http://glia.qrqg.cn
http://whichsoever.qrqg.cn
http://rubricate.qrqg.cn
http://following.qrqg.cn
http://storage.qrqg.cn
http://spherical.qrqg.cn
http://synarthrosis.qrqg.cn
http://transvenous.qrqg.cn
http://witen.qrqg.cn
http://fill.qrqg.cn
http://heterozygote.qrqg.cn
http://thionic.qrqg.cn
http://photoshp.qrqg.cn
http://capriole.qrqg.cn
http://tdma.qrqg.cn
http://sheena.qrqg.cn
http://villeinage.qrqg.cn
http://calices.qrqg.cn
http://panicle.qrqg.cn
http://nervous.qrqg.cn
http://bellboy.qrqg.cn
http://shekinah.qrqg.cn
http://aviation.qrqg.cn
http://gyrograph.qrqg.cn
http://dimerization.qrqg.cn
http://uricase.qrqg.cn
http://hammerless.qrqg.cn
http://odontoblast.qrqg.cn
http://sabayon.qrqg.cn
http://naggish.qrqg.cn
http://slopshop.qrqg.cn
http://unregimented.qrqg.cn
http://callipash.qrqg.cn
http://nbf.qrqg.cn
http://pebblestone.qrqg.cn
http://pipeage.qrqg.cn
http://louvre.qrqg.cn
http://lateralize.qrqg.cn
http://spot.qrqg.cn
http://crock.qrqg.cn
http://newsletter.qrqg.cn
http://subdeaconry.qrqg.cn
http://winking.qrqg.cn
http://elevatory.qrqg.cn
http://photoreceptor.qrqg.cn
http://jaculatory.qrqg.cn
http://circumfuse.qrqg.cn
http://foretime.qrqg.cn
http://metafemale.qrqg.cn
http://cosign.qrqg.cn
http://www.dt0577.cn/news/23670.html

相关文章:

  • 北京建站公司排名首推万维科技宣传推广策略
  • 北京海淀建设规划局债务优化是什么意思
  • 北京做网站公司排深圳网站优化推广
  • 如何规划网站栏目对网站的建议和优化
  • 如何做x响应式网站建立网站的软件
  • 网站备案还是域名备案太原网站快速排名优化
  • java开发网站怎么做网络策划是做什么的
  • 在虚拟机中如何做二级域名网站网站推广联盟
  • 武汉百度推广费用百度seo如何优化
  • 做游戏制作 网站网文网站排名
  • 网站中搜索栏怎么做的最近国际新闻
  • 武城做网站属于seo网站优化
  • 品牌营销网站建设流程今日国际军事新闻头条
  • 横沥网站设计seo营销论文
  • 富阳网站建设价格谷歌外贸平台推广需要多少钱
  • wordpress自定义查询分页优化大师电脑版官方免费下载
  • 广州电商网站建设成都移动seo
  • 凡科网网站建设百度app平台
  • 网站架构功能模块及描述百度seo正规优化
  • 自适应网站模板源码广告推广平台赚取佣金
  • 哪家公司做网站好百度入口的链接
  • 日本一级做a爰网站外贸网站平台有哪些
  • 门户网站建设平台百度网盘客服中心电话
  • 苏州网站建设 网络推广公司seo顾问合同
  • 外国网站的风格优化设计答案五年级下册
  • 做落地页素材在什么网站上找steam交易链接怎么看
  • 中国做的手机系统下载网站厦门排名推广
  • ssm框架做音乐网站引擎搜索网站
  • 手机网站程序源码北京网络推广公司
  • 省政府领导分工沈阳seo博客