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. 火鸡堂 对 基于云的胜利冲锋队 为了交项目干杯 的 Beta 产品测试报告

    基于云的胜利冲锋队 第一次上手 第一次上手体验感觉如何?能否正常运行? 不错,学生端和老师端各功能很清晰,大部分功能正常运行,但添加班级之类的部分功能页面暂时无响应 看到千帆竞发图泪流满面,图表中有各 ...

  2. JUnit 4.x 知识点

    注解 @Test: 测试方法,在这里还可以测试期望异常和超时时间. @Before: 每个测试方法执行之前执行的方法. @BeforeClass: 一个测试类中所有测试方法执行之前执行的方法,只执行一 ...

  3. WHAT IS GAME-BASED LEARNING?

    https://www.growthengineering.co.uk/what-is-game-based-learning/ Gamification and game-based learnin ...

  4. CF379C-New Year Ratings Change

    https://www.luogu.org/problemnew/show/CF379C 一道水题,折腾了我好久! 解题: 先排序,从小到大挨个满足客户,把最终rating放进集合里,判断是否已经给出 ...

  5. IDEA+Maven+Mybatis 巨坑:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.rao.mapper.UserMapper.findAll

    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.rao.mapper.User ...

  6. es6 -- 与解构赋值默认值结合使用

    参数默认值可以与解构赋值的默认值,结合起来使用. function foo({x, y = 5}) { console.log(x, y) } foo({}) // undefined 5 foo({ ...

  7. (尚032)Vue_案例_消息订阅与发布(组件订阅与发布(PubSubJS库))

    组件订阅与发布(PubSubJS库) npm info pubsub-js 安装库 npm install --save pubsub -js ============================ ...

  8. 将zabbix服务和monitor服务在一个机器上部署

    问题,两个服务的文件路径都是 /usr/local/sdata下,要让两个服务共存,至少需要讲一个服务的文件迁移到别的文件夹,同时将所有的配置项都进行修改,使能找到指定的文件路径, 方案1,先按照za ...

  9. rundeck配置salt-api

    Rundeck 安装: 系统: # cat /etc/issue CentOS release 6.7 (Final) 内核: # uname -r -.el6.x86_64 IP 地址: 172.1 ...

  10. C++ Boost

    Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C+ ...