zoukankan      html  css  js  c++  java
  • 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基础——编程练习(二)
    JAVA基础——面向对象三大特性:封装、继承、多态
    JVM内存
    50. Pow(x, n) (JAVA)
    47. Permutations II (JAVA)
    46. Permutations (JAVA)
    45. Jump Game II (JAVA)
    43. Multiply Strings (JAVA)
    42. Trapping Rain Water (JAVA)
    41. First Missing Positive (JAVA)
  • 原文地址:https://www.cnblogs.com/qstudy/p/10201106.html
Copyright © 2011-2022 走看看