GO语言基础---值传递与引用传递
package main import (
"fmt"
) /*
值传递
函数的【形式参数】是对【实际参数】的值拷贝
所有对地址中内容的修改都与外界的实际参数无关
所有基本数据类型作为参数时,都是值传递
*/
func ChangeBaseValue(v int) {
fmt.Printf("main: v address=%p\n",&v)
v *= 2
//函数返回时所有局部变量(此处包含形式参数v)都被释放了
} /*
引用传递(地址传递)
函数的【形式参数】记录的是【实际参数】的地址
所有对地址中内容的修改都会直接改变外界的实际参数
*/
func ChangeBaseValuePtr(v *int) {
fmt.Printf("main: v address=%p\n",v)
*v *= 2
} type Person struct {
Age int
} /*
结构体的值传递
形式参数p是对实际参数zhangsan的值拷贝
对p做任何事情都不会对zhangsan产生任何影响
p是函数执行过程中产生的局部变量,函数执行完毕就释放
*/
func ChangeObjectValue(p Person) {
fmt.Printf("ChangeObjectValue:p address=%p\n", &p)
p.Age *= 2
//函数返回时所有局部变量(此处包含形式参数v)都被释放了
} /*
结构体的引用传递(地址传递)
形式参数p记录的是实际参数zhansan的内存地址
对p中的内容做任何修改都是对zhangsan的直接修改
p是函数执行过程中产生的局部变量,函数执行完毕就释放
*/
func ChangeObjectValuePtr(p *Person) {
fmt.Printf("ChangeObjectValue:p address=%p\n", p)
p.Age *= 2
//函数返回时所有局部变量(此处包含形式参数v)都被释放了
} /*
数组作为形参:值传递
切片和map:现有内容/元素都是引用传递
*/
func ChangeContainerValue(array [3]int, slice []int, mMap map[string]int) {
fmt.Printf("ChangeContainerValue:array[0] address=%p\n",&array[0])
fmt.Printf("ChangeContainerValue:slice[0] address=%p\n",&slice[0])
fmt.Printf("ChangeContainerValue:map address=%p\n",mMap) array[0] = 100
slice[0] = 200
mMap["老大"] = 300
} func ChangeContainerValuePtr(array *[3]int, slice *[]int, mMap *map[string]int) { (*array)[0] = 100
(*slice)[0] = 200
(*mMap)["老大"] = 300
*slice = append(*slice, 4)
(*mMap)["老四"] = 4
} /*基本类型的值传递与引用传递*/
func main021() {
var a = 10
fmt.Printf("main: a address=%p\n",&a)
ChangeBaseValue(a)
fmt.Printf("main: a address=%p\n",&a)
fmt.Println(a) ChangeBaseValuePtr(&a)
fmt.Printf("main: a address=%p\n",&a)
fmt.Println(a)
} /*结构体的值传递与引用传递*/
func main022() {
zhangsan := Person{Age: 10}
fmt.Printf("main: zhangsan address=%p\n", &zhangsan)
//ChangeObjectValue(zhangsan)
ChangeObjectValuePtr(&zhangsan)
fmt.Println(zhangsan.Age)
} func main() {
var array = [3]int{1,2,3}
slice := make([]int, 0)
slice = append(slice, 1, 2, 3)
mMap := make(map[string]int)
mMap["老大"] = 1
mMap["老二"] = 2
mMap["老三"] = 3
fmt.Printf("main:array[0] address=%p\n",&array[0])
fmt.Printf("main:slice[0] address=%p\n",&slice[0])
fmt.Printf("main:map address=%p\n",mMap)
//ChangeContainerValue(array, slice, mMap)
ChangeContainerValuePtr(&array, &slice, &mMap) fmt.Println(array)
fmt.Println(slice)
fmt.Println(mMap)
}
输出:
main:array[0] address=0xc0000102e0
main:slice[0] address=0xc000010300
main:map address=0xc000062240
[100 2 3]
[200 2 3 4]
map[老大:300 老二:2 老三:3 老四:4]
GO语言基础---值传递与引用传递的更多相关文章
- C#基础原理拾遗——引用类型的值传递和引用传递
C#基础原理拾遗——引用类型的值传递和引用传递 以前写博客不深动,只搭个架子,像做笔记,没有自己的思考,也没什么人来看.这个毛病得改,就从这一篇开始… 最近准备面试,深感基础之重要,奈何我不是计算机科 ...
- C语言:值传递,地址传递和引用传递(example:值交换)
于C语言中值传递.地址传递和引用传递的我个人理解. 通过一个例子:swap(交换两个整型变量的值)来表现! #include <stdio.h> void swap1(int* a,int ...
- C#学习笔记(基础知识回顾)之值传递和引用传递
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
- C#基础原理拾遗——引用类型的值传递和引用传递
以前写博客不深动,只搭个架子,像做笔记,没有自己的思考,也没什么人来看.这个毛病得改,就从这一篇开始- 最近准备面试,深感基础之重要,奈何我不是计算机科班出身,基础方面有些捉襟见肘.短期怎么补?做面实 ...
- java基础 - 形参和实参,值传递和引用传递
形参和实参 形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的. 形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元. 因此,形 ...
- Java是值传递还是引用传递?
Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...
- 堆栈详解 + 彻底理解Java的值传递和引用传递
本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
- Java的值传递和引用传递的说法
学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java ...
- 多图证明,Java到底是值传递还是引用传递?
开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见正文. 说到值传递和引用传递我们不得不提到两个概念:值类型和引用类型. 1.值类型 通俗意义上来说,所谓的值类型指的就 ...
随机推荐
- 1113 Integer Set Partition
Given a set of N (>) positive integers, you are supposed to partition them into two disjoint sets ...
- 7.If语句
if单选择结构 语法: if(布尔表达式){ //如果布尔表达式为true将执行的语句 } 例: import java.util.Scanner; public class IfDemo { pub ...
- 在 Y 分钟内学会 Python
在 Y 分钟内学会 Python 这是翻译, 原文地址: Learn Python in Y Minutes 在 90 年代初, Python 由 Guido van Rossum 创造, 现在, 它 ...
- Nginx 配置浏览Linux 系统目录并下载文件
准备工作: 安装编译工具及库文件: yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel 安装PCRE( ...
- hdu1671 字典树记录前缀出现次数
题意: 给你一堆电话号,问你这些电话号后面有没有相互冲突的,冲突的条件是当前这个电话号是另一个电话号的前缀,比如有 123456789 123,那么这两个电话号就冲突了,直接输出NO. 思 ...
- Windowsw核心编程 第13章 Windows内存结构
第1 3章 Wi n d o w s的内存结构 13.1 进程的虚拟地址空间 每个进程都被赋予它自己的虚拟地址空间.对于 3 2位进程来说,这个地址空间是4 G B,因为3 2位指针可以拥有从0 x ...
- Swift系列五 - 可选项
可选项,一般也叫可选类型,它允许将值设为nil. 一.定义可选项 平时开发中,如果我们需要把一个变量置空时只需要把变量赋值一个nil即可: 上面尝试后不行,那怎么把一个变量置空呢? 答案:把变量设置可 ...
- @NotNull 、@NotBlank、@NotEmpty区别
@NotNull: 主要用在基本数据类型上(Integer.Double...) 不能为null,但可以为empty 举例: @NotNull(message = "标题不能为空" ...
- Jenkins+Git的搭建和自动部署
前言 Jenkins在工作中都使用过,之前都是运维去搭建部署,弄好了之后给我一个网址去构建项目就可以了,所以也都是一直没了解过安装过程. 今天在自己的服务器上搭建了一遍,中间有遇到很多坑,特在此归纳总 ...
- 使用花生壳、瑞友天翼远程访问金蝶K3
金蝶版本号 WISE15.1 瑞友6.0系列 花生壳5 金蝶软件无法通过外网直接访问 因此需要使用瑞友天翼来实现远程访问 一般来说 金蝶服务器固定了IP地址以后 通过路由器开房两个外网端口即可实现瑞友 ...