go 语言值传递和引用传递

article/2025/9/12 23:29:28

值传递

普通的值传递

package main
import "fmt"
func main(){fmt.Println(Hello("hello"," fpp"));
}
func Hello(stringName string,stringName2 string)(string){return stringName+stringName2;
}

在这里插入图片描述

string类型是引用传递吗?

package main
import "fmt"
func main(){stringName:="hello";stringName2:=" fpp";fmt.Println(Hello(stringName,stringName2));fmt.Println(stringName);
}
func Hello(stringName string,stringName2 string)(string){stringName="hell";return stringName+stringName2;
}

在这里插入图片描述

说明string类型是值传递

引用传递

传递一个数组

package main
import "fmt"
func main(){var array1 [2]int={1,2};MyArray(array1);var i int;for i=0;i<2;i++{fmt.Println(array1[i]);}
}
func MyArray(array1 []int){array[0]=1234;
}

在这里插入图片描述

运行报错 不能这样传参我笑了 习惯了java

我猜测要这样才能运行,必须指定长度

package main
import "fmt"
func main(){var array1 [2]int={1,2};MyArray(array1);var i int;for i=0;i<2;i++{fmt.Println(array1[i]);}
}
func MyArray(array1 [2]int){array1[0]=1234;
}

果然可以 但是并没有修改到数组的值 ,说明这不是我们想象的那种引用传递

疑问是不是只能传指针呢才能生效

package main
import "fmt"
func main(){var array1 [2]int={1,2};var array1Point *[2]int;var i int;//将数组的地址传给指针for i=0;i<2;i++{array1Point[i]=&array1[i];}MyArray(array1Point);for i=0;i<2;i++{fmt.Println(array1[i]);}
}
func MyArray(array1 [2]*int){var a int=1234;array1[0]=&a;
}

又报错了 我了个去

在这里插入图片描述

看了半天 原来指针的声明方式错了 应该是

var arrayPoint [2]*int;

修改代码重新试一试

package main
import "fmt"
func main(){array1:=[2]int{1,2};var array1Point [2]*int;var i int;for i=0;i<2;i++{array1Point[i]=&array1[i];}MyArray(array1Point);for i=0;i<2;i++{fmt.Println(*array1Point[i]);}
}
func MyArray(array1 [2]*int){var a int=1234;array1[0]=&a;
}

发现没有报错但是还是没有达到 引用传递的目的
在这里插入图片描述

这个类似 array1[0]=&a; 将变量a的地址 赋给指针array1[0]

但是貌似这个指针的值并没有发生改变非常奇怪啊

我理解变量a的地址指向 1234,并且把这个地址指向了这个array1指针,按理来说应该值会变啊 为啥不会变非常奇怪

我理解的 未执行MyArray 方法时候的内存地址图

在这里插入图片描述

执行MyArray方法之后的内存地址图

在这里插入图片描述
修改代码打印一下地址

package main
import "fmt"
func main(){array:=[2]int{1,2};var arrayPoint [2]*int;var i int;for i=0;i<2;i++{fmt.Printf("array 内存地址 %v",&array[i]);fmt.Println()}for i=0;i<2;i++{arrayPoint[i]=&array[i]fmt.Printf("point value %v,%v",*arrayPoint[i],&arrayPoint[i]);fmt.Println()}MyArray(arrayPoint);//遍历数组for i=0;i<2;i++{fmt.Printf("after point value %v,%v ",*arrayPoint[i],&arrayPoint[i]);fmt.Println()}
}func MyArray(arrayPoint [2]*int){temp:=123;arrayPoint[0]=&temp;
}

在这里插入图片描述

地址没改变 值也没改变,看来与java的引用传递还是不太一样,这个地址的传递应该不是我们想象当中的那种传递

再修改代码试试

package main
import "fmt"
func main(){array:=[2]int{1,2};var arrayPoint [2]*int;var i int;for i=0;i<2;i++{fmt.Printf("array 内存地址 %v",&array[i]);fmt.Println()}for i=0;i<2;i++{arrayPoint[i]=&array[i]fmt.Printf("point value %v,%v",*arrayPoint[i],&arrayPoint[i]);fmt.Println()}MyArray(arrayPoint);//遍历数组for i=0;i<2;i++{fmt.Printf("after point value %v,%v ",*arrayPoint[i],&arrayPoint[i]);fmt.Println()}
}
func MyArray(arrayPoint [2]*int){*arrayPoint[0]=123;
}

在这里插入图片描述

*arrayPoint[0]=123; 这种方式能够改变 0x00004e250 地址所指向的值

总结

1.值传递就是将普通的值传过来,在被处理的函数内部修改了参数也不会修改原来参数的值。 string类型就是值传递 和java一样

2.引用传递 目前测试过程当中 使用以下两种方式都不能达到引用传递的目的。

  1. array1[0]=1234;   
    array1是数组类型 但是这样修改数组里面元素的值
    
  2. var a int=1234;array1[0]=&a;   array1是指针类型这样想通过修改角标为0的地址值 然后达到修改值的目的 但是这样既不能修改地址,也不能修改值
    

正确的达到引用传递的目的应该是这种方式 *arrayPoint[0]=123; 这样是修改指针指向地址的值 不会修改指针的地址

由此可以大胆猜测 :

go语言想要达到引用传递的目的 是不是必须是指针作为入参,并且要通过*arrayPoint[0]=123 这种方式才能达到引用传递的目的?我将在后续的学习过程当中继续验证这个问题。


http://chatgpt.dhexx.cn/article/Bc14xOWI.shtml

相关文章

Java 的值传递和引用传递

一、概述 Java数据类型分为基本类型和引用类型。相应的&#xff0c;变量也有两种类型&#xff1a;基本类型和引用类型。 1️⃣基本类型的变量保存原始值&#xff0c;即它代表的值就是数值本身。包含&#xff1a; 整型&#xff1a;byte&#xff0c;short&#xff0c;int&#…

java值传递和引用传递(附实例)

java值传递和引用传递&#xff08;附实例&#xff09; 1.数据类型1.1 基本数据类型1.2 引用数据类型 2.形参与实参2.1 函数中使用2.2 调用 3.值传递和引用传递3.1 定义3.2 例子3.3 结论 观前提示&#xff1a; 本文所使用的IDEA版本为ultimate 2019.1&#xff0c;JDK版本为1.8.…

java中的值传递和引用传递

个人理解&#xff0c;可能会有错误之处&#xff0c;请仔细甄别&#xff0c;谨慎参考&#xff01;如有错误或不同见解请指出&#xff01; 值传递&#xff08;Pass By Value或者Call By Value&#xff09;是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。…

【JAVA】值传递与引用传递

一.声明 Java中没有引用传递 二.值传递和引用传递 值传递&#xff1a;就是在方法调用的时候&#xff0c;实参是将自己的一份拷贝赋给形参&#xff0c;在方法内&#xff0c;对该参数值的修改不影响原来的实参。 引用传递&#xff1a;是在方法调用的时候&#xff0c;实参将自…

值传递与引用传递详解

1、关于值传递 值传递&#xff1a;是指在调用函数时&#xff0c;将实际参数复制一份传递到函数中&#xff0c;这样在函数中如果对参数进行修改&#xff0c;就不会影响到实际参数 如下图所示&#xff0c;当传递参数之前会将参数进行复制&#xff0c;函数中修改了参数&#xff0c…

值传递与引用传递的区别

一、值传递&#xff1a;是指在调用函数时将实际参数复制一份传递到函数中&#xff0c;这样在函数中如果对参数进行修改&#xff0c;将不会影响到实际参数。 ​ 代码在内存中的执行流程&#xff1a; 1、首先加载main方法&#xff1b; ​ 2、接下来int number 100&#xff1…

什么是值传递,什么是引用传递?

1、什么是值传递&#xff0c;什么是引用传递&#xff1f; 值传递&#xff08;pass by value&#xff09;是指在调用函数时将实际参数复制一份传递到函数中&#xff0c;这样在函数中如果对参数进行修改&#xff0c;将不会影响到实际参数。引用传递&#xff08;pass by referenc…

Java复习总结之快速区分值传递和引用传递

引言 为了搞清楚值传递和引用传递的区别&#xff0c;查阅了许多资料&#xff0c;加以自身理解&#xff0c;做出本篇博客用于记录。 概念 值传递&#xff1a;指在调用函数时将实际参数复制一份传递到函数中&#xff0c;这样在函数中如果对参数进行修改&#xff0c;将不会影响到…

华为应聘进展状态码解析(附加性格测试攻略)

多方查找咨询终于终于看到了自己的状态码&#xff0c;总结一下~ 性格测试攻略&#xff1a; https://blog.csdn.net/guomutian911/article/details/48915301 https://blog.csdn.net/twc829/article/details/51226358 https://blog.csdn.net/twc829/article/details/51226247 第三…

华为OD机试2023 最新最全备考攻略助你轻松上岸

【华为OD机试真题 2022&2023】真题目录 点这里 【华为OD机试真题】信号发射和接收 &试读& 点这里 【华为OD机试真题】租车骑绿道 &试读& 点这里 什么是华为OD 华为OD是Outsourcing Dispacth模式&#xff0c;是华为和外企德科联合招聘的简称。目前华为大多…

idea 怎么导入maven项目

1、打开一个现有的IntelliJ IDEA工程&#xff0c;点击菜单的“File”->“new”->“Module from Existing Sources”。 更详细请点击&#xff1a;http://yayihouse.com/yayishuwu/chapter/1826

IntelliJ IDEA如何导入Gradle项目

https://blog.csdn.net/wangdong5678999/article/details/70255451 IntelliJ IDEA如何导入Gradle项目 栋先生 2017-04-20 10:14:03 95942 收藏 分类专栏&#xff1a; 其他 文章标签&#xff1a; idea intellij idea gradle 版权 最近学习Gradle&#xff0c;本文来重点介绍…

杂记——16.idea中导入maven项目

这篇文章我们来讲一下如何从Gitee上拉取项目&#xff0c;并将该项目导入到idea中 目录 1.拉取项目 2.idea导入项目 3.更改相关的配置 3.1更改maven仓库 3.2更改数据库的连接池 1.拉取项目 第一步&#xff1a;找到相关的项目地址 如图所示&#xff0c;在Gitee上找到相关的…

idea项目导入eclipse中步骤

1、打开eclipse&#xff0c;右键import 找到需要导入的项目 2、重新配置tomcat&#xff0c;已经配置好了建议移除后重新添加&#xff0c; window-preference 3、项目上右键-debug AS-发现没有 debug on server,这是没有转成web项目 项目右键-properties 配置好后会出…

idea与eclipse项目相互导入方式

目录 idea项目往eclipse中导入 idea项目导出到桌面 idea项目导入到工程中 idea项目迁徙到eclipse 第一种导入方式&#xff1a; 第二种导入方式&#xff1a; 第三种导入方式&#xff1a; eclipse项目往idea中导入 idea项目往eclipse中导入 idea项目导出到桌面 直…

idea中导入maven项目并运行

当我们从网上下载人家的maven项目该怎样导入并运行呢&#xff0c;请看如下步骤。 File->New->Project from Existing Source 选择maven项目下的pom.xml文件 File -> Project Structure 填写编译输出路径 6. 如果右边的某些项是红色的&#xff0c;点击右边的maven进行…

IDEA中导入Maven工程或项目

IDEA中导入Maven工程或项目 本文简单讲述了IDEA中导入Maven工程或项目。为了减轻读者压力笔者将 IDEA 相关应用技巧分解成了多篇文章置于主页 IDEA 专栏&#xff0c;若本文没有帮助到您&#xff0c;请去主页 IDEA 专栏检索吧 &#x1f60f;。 文章目录 IDEA中导入Maven工程或项…

使用IDEA导入SpringBoot项目

有时候会拿到别人现成的 springboot 项目&#xff0c;而不是从头自己做一个。 这个时候&#xff0c;就需要用导入的方式来 import 这么一个项目了。 1.IDEA 导入 SpringBoot 项目办法&#xff1a; 1&#xff09;菜单 -> File -> New -> Project from Existing Sourc…

Intellij IDEA 导入 eclipse web 项目详细操作

Intellij IDEA 导入 eclipse web 项目详细操作 第一步&#xff1a;准备工具我用的是 IntelliJ IDEA 2017.1(64) 这个版本的&#xff0c;在eclipse中找到我之前写skye_cnmy(非Maven),skye_client(Maven)的项目导入。 第二步&#xff1a;在Intellij IDEA File–>New–>Pr…

IDEA导入本地项目

1.文件-New—-Model from Existing Sources 2.选中需要导入的项目 3、选择maven文件选项&#xff0c;从外部模型导入模块。 Idea本地项目部署路径 IDEA不会把你的项目部署到你的Tomcat安装目录&#xff0c;它会在操作系统盘的用户目录下新建一个目录&#xff0c;这个目录一般是…