go语言中的值类型:

  int、float、bool、array、sturct等

  值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数

  声明一个值类型变量时,编译器会在栈中分配一个空间,空间里存储的就是该变量的值    

go语言中的引用类型:

  slice,map,channel,interface,func,string等

  声明一个引用类型的变量,编译器会把实例的内存分配在堆上

  string和其他语言一样,是引用类型,string的底层实现struct String { byte* str; intgo len; }; 但是因为string不允许修改,每次操作string只能生成新的对象,所以在看起来使用时像值类型。

  所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

  需要注意的是:引用类型在函数的内部可以对它的值进行修改,但是如果给形参重新赋值,重新赋值后的形参再怎么修改都不会影响外面的实参了

  nil可以赋值给引用类型(除string外)、error类型和指针类型

 

go语言中的指针类型:

  一个指针变量指向了一个值的内存地址

   当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针

  一个指针变量通常缩写为 ptr

  其实引用类型可以看作对指针的封装

空指针判断:

if(ptr != nil)     /* ptr 不是空指针 */
if(ptr == nil) /* ptr 是空指针 */

例子:

package main

import "fmt"

type pArr []int

func (p *pArr) oopFunc() {
(*p)[] =
} type newFunc func(string) func strFunc(s string) {
fmt.Printf("%T ", s[]) //uint8
fmt.Println(s) //hello world
} type Person struct {
Name string
Height int
} func changeStruct(p Person) {
p.Name = "李四"
p.Height =
} func main() { //切片指针的使用
var ptr []*int
i :=
ptr = append(ptr, &i)
fmt.Println("ptr:", *ptr[]) //结构体是值类型
person := Person{
"张三",
,
}
changeStruct(person)
fmt.Println(person) //{张三 180} //func 可以作为参数进行传递
var nf newFunc
nf = strFunc
str := "hello world"
nf(str) //uint8 hello world //类似面向对象的方法
p := make(pArr, )
p.oopFunc()
fmt.Println("p:", p) //p: [0 0 0 111] //值类型无法被改变
num :=
valPass(num)
fmt.Println("num:", num) //num: 1 //引用类型可以在函数中被改变
nums := []int{, , , }
RefPass(nums)
fmt.Println("nums:", nums) //nums: [0 100 2 3] //形参可以改变引用类型的值,但不能够形参重新赋值
RefPass2(nums)
fmt.Println("nums:", nums) //nums: [0 100 2 3] //形参可以改变指针类型的值
n := new(int)
*n =
PointPass(n)
fmt.Println("n:", *n) //n: 12 //形参可以改变指针类型的值,但是对形参重新赋值,不会影响实参
PointPass2(n)
fmt.Println("n:", *n) //n: 12 } //指针传递,对指针重新赋值,指针指向了新的地址,此时对形参做修改将不再影响外面的实参
func PointPass2(num *int) {
num = new(int)
*num =
} // 指针传递,普通用法
func PointPass(num *int) {
*num =
} //引用传递,普通用法,这个会改变外面的实参
func RefPass(nums []int) {
nums[] =
} //引用传递,对形参重新赋值,不会改变外面的实参,形参指向了新的地址
func RefPass2(nums []int) {
nums = []int{, , , }
} //值传递
func valPass(num int) {
num =
}

go中值传递、引用传递、指针传递的区别的更多相关文章

  1. c++值传递和引用及指针传递区别

    以下程序各有何问题? ***************************************************************************************** ...

  2. Javascript参数传递中值和引用的一种理解

    值(value)和引用(reference)是各种编程语言老生常谈的话题,js也不例外. 我将剖析一个例子的实际运行过程,跟大家分享我对js参数传递中的值和引用的理解. 参考官网数据类型的两种分类,本 ...

  3. 传参数应该用哪种形式——值、引用、指针?

    类型:C++ & Qt4,创建时间:十二月 30, 2011, 7:43 p.m. 标题无"转载"即原创文章,版权所有.转载请注明来源:http://hgoldfish.c ...

  4. C#中值和引用

    c#中有两种基本类型,它们分别是值类型和引用类型:而每种类型都可以细分为如下类型: ps:1.基本类型是值类型 2.类.接口.委托都是引用类型

  5. C++中值传递、指针传递、引用传递的总结

    C++中值传递.指针传递.引用传递的总结   指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者.对比值传递,指针/引用传递可以将改变由形参"传给"实参(实际上就 ...

  6. c++中值传递,址传递,引用传递

    概念详解 1. 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值. 从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出: 当函数内部需要修改参数,并 ...

  7. java中值传递和引用传递

    最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

  8. C++指针传递和引用传递的区别 (转载整理)

    区别1:指针传递和引用传递是以不同的方式实现相同的效果,但是指针传递的本质还是值传递,只是传递的值是地址. 就拿 交换两个数的函数来举例: // 指针传递 void swap(int * val1, ...

  9. C语言指针传递详解

    传递指针可以让多个函数访问指针所引用的对象,而不用把对象声明为全局可访问,要在某个函数中修改数据,需要用指针传递数据,当数据是需要修改的指针的时候,就要传递指针的指针,传递参数(包括指针)的时候,传递 ...

  10. C++中引用和指针详解

    先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...

随机推荐

  1. 19、Python标准库: 日期和时间

    一.time时间模块 import time 1 .时间戳   时间戳(timestamp):时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. time_stamp = tim ...

  2. 不用图片做的三角语言框效果,纯样式编写,css三角样式写法

      2010-07-05 19:57:28 博主 回复 用户昵称 在秋日真的有轻柔吧. 上边效果与理想的有误差,代码布不上去,下边是源代码,另行保存后查看真正效果,下图是真正效果,区别在三角处,里面颜 ...

  3. list数组排序 Collections 按Date时间降序排列

    @ResponseBody @RequestMapping(value = {"K12", "12"}) public String refurbishLigh ...

  4. Linux内核Socket实现之------Socket创建(2) 文件描述符

    转载请注明:http://blog.chinaunix.net/uid-20788636-id-4408276.html 1.2 sock_map_fd函数 在用户空间创建了一个socket后,返回值 ...

  5. router.beforeEach、路由元信息、导航守卫与函数式编程

    一.函数的识别: 1.router.beforeEach:主函数.高阶函数.入口函数: 2.匿名参量函数:处理跳转过程中的附加逻辑 (to, from, next) => { if (to.ma ...

  6. 大文件上传组件webupload插件

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  7. cratedb 做为prometheus 的后端存储

    prometheus 提供了remote_write 以及remote_read 的数据存储方式,可以帮助我们进行数据的长时间存储.方便查询 cratedb 提供了对应的adapter,可以直接进行适 ...

  8. ESA2GJK1DH1K微信小程序篇: 测试微信小程序扫描Air202上面的二维码绑定设备,并通过MQTT控制设备

    前言 一,微信小程序篇小程序下载(该功能为小程序篇基础功能源码) 实现功能概要 微信小程序通过扫描GPRS上的二维码,绑定GPRS设备.然后使用小程序通过GPRS远程控制开发板上的继电器, 远程显示单 ...

  9. 第03组 Alpha冲刺(3/4)

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...

  10. 【luoguP3000】 [USACO10DEC]牛的健美操Cow Calisthenics

    题目链接 二分答案,判断需要断几条边,用\(f[i]\)表示以\(i\)为根的子树断边后的最长路径,对于一个点\(u\),存在\(f[v]>mid\)时就删到\(v\)的边\(f[v1]+f[v ...