• go语言关于值类型和引用类型


    前言:关于值类型和引用类型确实是个比较绕的问题,之前在学校的时候学习C语言的时候,就感觉没有看太懂,后面看java,关于引用也是模模糊糊,这个东西也确实比较抽象,估计好多写了好几年代码的人有也有些迷惑。

    1、在go语言中,值类型和引用类型有以下特点:

    a、值类型:基本数据类型,int,float,bool,string,以及数组和struct
    特点:变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放

    b、引用类型:指针,slice,map,chan等都是引用类型
    特点:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配,通过GC回收。

    2、这个的东西总结也不太好描述,还是代码看得比较清楚,用函数实现交换两个函数的值,来深刻感受以下值类型和引用类型:

    package main
    
    import (
    	"fmt"
    )
    
    //在函数内部修改值,不会影响函数外它的值,int是值类型
    func swap1(a, b int) {
    	temp := a
    	a = b
    	b = temp
    }
    
    //可以通过返回值,实现交换
    func swap2(a, b int) (c, d int) {
    	c = b
    	d = a
    	return c, d
    
    }
    
    //指针是一个地址,值传递后,在栈中分配的内存存储的值是a,b的地址,所以通过指针*a,*b这样是可以改变值的。
    func swap3(a, b *int) {
    	temp := *a
    	*a = *b
    	*b = temp
    	return
    }
    
    // 这样交换的是两个表示内存地址的值,也是不会影响函数外边的值的
    func swap4(a, b *int) {
    	temp := a
    	a = b
    	b = temp
    }
    
    func main() {
    	first := 100
    	second := 200
    	third := 300
    	fourth := 400
    
    	swap1(first, second)
    	fmt.Println("first= ", first)
    	fmt.Println("second= ", second)
    
    	three, four := swap2(300, 400)
    	fmt.Println("third= ", three)
    	fmt.Println("fourth= ", four)
    
    	swap3(&first, &second)
    	fmt.Println("first= ", first)
    	fmt.Println("second= ", second)
    
    	swap4(&third, &fourth)
    	fmt.Println("third= ", third)
    	fmt.Println("fourth= ", fourth)
    
    }
    

      结果执行如下:

    first=  100
    second=  200
    third=  400
    fourth=  300
    first=  200
    second=  100
    third=  300
    fourth=  400
    

      可能还是比较绕,慢慢理解吧,哈哈~~~

    3、关于值传递和引用传递

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

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

    其实在go语言中,只存在值传递,好多人有个误解,说slice,map,chan这些引用类型是引用传递,误区可能就是:map、slice、channel这类引用类型在传递到函数内部,可以在函数内部对它的值进行修改而引起的误会。

  • 相关阅读:
    JAVA邀请码生成器
    Mybatis+Spring实现Mysql读写分离
    Apache HttpComponents 工具类 [ HttpUtil ]
    JAVA短信验证码 工具类
    Spring 集成 Redis
    Java图片高保真缩放工具类
    JAVA Sftp 上传下载
    java项目小手册
    WebSocket前后端实现
    页面PC端 / 移动端整屏纵向翻页,点击/触摸滑动效果功能代码非插件
  • 原文地址:https://www.cnblogs.com/qstudy/p/10201106.html
Copyright © 2020-2023  润新知