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. 一台服务器配置多个TOMCAT

    如果要在一台服务器上配置多个Tomcat,主要就是要避免Tomcat服务器的端口冲突的问题.只需要修改CATALINA_HOME\conf\server.xml中的启动端口和连接端口就OK了! 下面我 ...

  2. xpath用发

    xpath的更多语法: https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-2.0/ms256039(v=vs ...

  3. linux内核中的文件描述符(二)--socket和文件描述符

    http://blog.csdn.net/ce123_zhouwei/article/details/8459730 Linux内核中的文件描述符(二)--socket和文件描述符 Kernel ve ...

  4. Cookie实现购物车功能

    这里的购物车暂时存放书,后期把参数改成Object,把方法抽取成接口,只要实现了接口的Object类都可以放进购物项,这样就实现了购物任何物品 使用购物项因为一个购物项可以包含某种商品的数量,总价等, ...

  5. uni-app 获取网络状态

    uni.getNetworkType(OBJECT) 获取网络类型. OBJECT 参数说明 参数名 类型 必填 说明 success Function 是 接口调用成功,返回网络类型 network ...

  6. GoCN每日新闻(2019-11-05)

    GoCN每日新闻(2019-11-05) GoCN每日新闻(2019-11-05) 1. Protobuf 终极教程 https://colobu.com/2019/10/03/protobuf-ul ...

  7. Powershell基础学习

    从吐司偷来的图片,拿来当做引导吧: 0x01 简介 Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能.当然 ...

  8. OpenFOAM——前台阶

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL037:Turbulent Flow Over a Forward Facing ...

  9. 性能测试-cpu负载和cpu利用率

    概述 做压力测试的时候,我们经常会关注两个指标,CPU利用率和CPU负载 Linux中,进程分为三种状态: 阻塞的进程blocked process 可运行的进程runnable process 正在 ...

  10. Pyhton学习的基础

    函数->功能, 如print(),input(),range(), 方法->功能, 如index()(尽量不用此方法),find(),类里面的函数就叫做方法 容器->列表,字符串,元 ...