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.值类型 通俗意义上来说,所谓的值类型指的就 ...
随机推荐
- web前端的超神之路
前端超神之路 前端基础知识 HTML :用户实现页面的工具 CSS:用于美化界面的工具 javascript:用于操作html元素和css样式,让你的页面效果更美观 前端进阶知识 jQuery:用于简 ...
- 机器人走方格-51nod解题
M * N的方格,一个机器人从左上走到右下,只能向右或向下走. 有多少种不同的走法? 注意:给定 M, N 是一个正整数. 示例 输入: 1行, 2个数M,N,中间用空格隔开.(2 <= m,n ...
- git 避免重复输入用户名密码问题解决
"store" 模式会将凭证用明文的形式存放在磁盘中,并且永不过期. 这意味着除非你修改了你在 Git 服务器上的密码,否则你永远不需要再次输入你的凭证信息. 这种方式的缺点是你的 ...
- codeforces 229C
题意: http://codeforces.com/problemset/problem/229/C 给你一个全图,分成两部分,问你这两个途中一共有多少个三角形. 思 ...
- KMP中next数组的理解
next数组是KMP的核心,但对于next数组我们总是有时候感觉明白了,但有时候又感觉没明白,现在我就说下我自己对KMP中next数组的理解,首先next[i]上的数字的意义,next[i]表示的是当 ...
- 【Git】3. Git重要特性-分支操作,合并冲突详解
一.分支介绍 在版本控制过程当中,有时候需要同时推进多个任务,这样的话,就可以给每个任务创建单独的分支. 有了分支之后,对应的开发人员就可以把自己的工作从主线上分离出来,在做自己分支开发的时候,不会影 ...
- 『动善时』JMeter基础 — 8、JMeter主要元件介绍
目录 1.测试计划(Test Plan) 2.线程组 3.取样器(sampler) 4.逻辑控制器(Logic Controller) 5.配置元件(Config Element) 6.定时器(Tim ...
- jdk8-stream-api
1.stream简介 stream 是一个用来处理集合个数组的api jdk 8 引入strream的原因:1.去掉for循环,使编程变的更加简单(实际运行效率可能没有for循环高)2.paralle ...
- FreeSql之Expression表达式拼接参数扩展
在FreeSql源码中Expression表达式拼接默认最多支持到5个泛型参数,当我们使用表关联比较多的时候,就需要进行扩展. 新建一个类,将命名空间改为System.Linq.Expressions ...
- 本地Markdown上传图片
本地Markdown上传图片 1.上传本地markdown文件到博客园 使用工具pycnblog 下载:https://github.com/dongfanger/PyCnblog 查看READ ME ...