网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

go值传递和地址传递的案例-创新互联

这篇文章主要介绍了go值传递和地址传递的案例,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

创新互联公司专业为企业提供淅川网站建设、淅川做网站、淅川网站设计、淅川网站制作等企业网站建设、网页设计与制作、淅川企业网站模板建站服务,十载淅川做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

                                                       

先来看个简单的例子

1、变量前面加个&表示这个变量的地址(也就是这个变量的指针),指针变量前面加*表示这个指针对应的值 (自己理解下)

//main.gopackage main
func ByAss() {
  s := 100
  p := &s  // s 的地址给了p

  fmt.Println(*p) //100 所以p对应的值变成了100
  *p += 100
  fmt.Println(*p)  //200
  fmt.Println(s) //200 p和s相同的地址,所以s也变成200}//demo.gopackage main
func main() {
  ByAss()}

Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量,比如 Function(arg1)。

2、普通值传递 (注意这个例子,看起来很简单,但是容易忽略)

func ByValue1(n1 int) {
  //此时n1 是n 的一个拷贝,所以地址不一样
  fmt.Println(&n1)//0xc00000a098}package main
func main() {
  n := 100
  fmt.Println(&n) //0xc00000a090
  ByValue1(n)//传递副本}

如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加 & 符号,比如 &variable)传递给函数,这就是按引用传递,比如 Function(&arg1),此时传递给函数的是一个指针。

3、如果想用地址传递

func main() {
    n := 100
    fmt.Println(&n) //0xc00000a090
    ByReference(&n) //传递指针
    fmt.Println(n) //200}//注意函数 参数类型需要是用指针符号(*)func ByReference(n1 *int) {

   *n1 += 100
   fmt.Println(n1)//0xc00000a090 地址与n相同, 所以n值被改变了
  //注意
  //ip := &n1//这个写法有问题,表示地址的地址
  //fmt.Println(ip)}

4、看下数组

  • (a)数组也是值传递
    arr := [5]int{1,3,5,6,7}arrByValue(&arr) //也需要使用& 符号fmt.Println(arr) //[100 300 5 6 7]func arrByValue(arr1 *[5]int) {
     arr2 := arr1
     arr2[0] = 100
     arr2[1] = 300}

5、下面是切片的例子 (可变的数组)切片是引用传递

func main() {
    arr := []int{1,3,5,6,7}
    bbb(arr) //没有使用& 符号
    fmt.Print(arr[0])// 11 结果已经改变,说明数组是地址传递

    //就算不通过函数,也是引用传递
    //arr := []int{1,3,5,6,7}
    //arr2 := arr
    //arr2[1] = 0
    //fmt.Print(arr)//[1 0 5 6 7]}//aaafunc bbb(arr1 []int) {
   arr1[0] += 10}
  • (b)在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。

感谢你能够认真阅读完这篇文章,希望小编分享go值传递和地址传递的案例内容对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联网站制作公司行业资讯频道,遇到问题就找创新互联,详细的解决方法等着你来学习!


分享名称:go值传递和地址传递的案例-创新互联
网站链接:http://bjjierui.cn/article/dshhic.html

其他资讯