go之值类型与引用类型使用及说明

作者:

文章目录
  • Go语言的数据类型有 值类型 与 引用类型 两种。 值类型:在初始化、赋值时,两个变量互不影响;参数传递时,传递的是一个副本 引用类型:在初始化、赋值时,两个变量实际是同一个;参数传递时,传递的是变量本身。 在Go语言中,只有slice、map、interface、channel是引用类型,其他的都是值类型。
  • Golang中没有class关键字来定义类,对于事物的抽象以struct来定义,因此一个struct变量可以被看做一个类实例。 但是这有别于java,因为struct在方法中传参时是值类型而非引用类型,所以当需要在方法内改变这个对象的字段值时,应该使用的是struct变量的指针,而非struct变量。 type Student struct{ Name string } func (s * Student) Set(name string){ s.Name = name } func (s Student) Get()string{ return s.Name } 由上可知: 如果方法内部会修改当前对象的字段或改变其值,需要用指针。 由于值传递是(内存)复制,因此,如果对象比较大,应该使用指针(地址),避免内存拷贝(值类型等变量指向内存中的值,如果有值类型变量存放大量元素,或造成内存的大量拷贝)。 注意:不见得使用指针就一定好过传值,因为按照 Go 的内存管理策略,涉及指针和引用的对象会被分配到 GC Heap 上。如果对象很 “小”,显然要比在栈上进行值拷贝 “耗费” 更多。
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Go语言中的值类型与引用类型的使用 Go中的字典Map增删改查、排序及其值类型 一文带你掌握Golang中的值类型和引用类型 go语言中值类型和指针类型的深入理解 golang值类型转换成[]uint8类型的操作 Golang断言判断值类型的实现方法
  • 目录
    • 1 概述
    • 2案例
      • 2.1 值类型
      • 2.2 引用类型
    • 3 golang中的struct类型
      • 总结

        Go语言的数据类型有 值类型 与 引用类型 两种。

        • 值类型:在初始化、赋值时,两个变量互不影响;参数传递时,传递的是一个副本
        • 引用类型:在初始化、赋值时,两个变量实际是同一个;参数传递时,传递的是变量本身。

        在Go语言中,只有slice、map、interface、channel是引用类型,其他的都是值类型。

        数组array类型是值类型,那么在使用相同的类型的变量初始化另一个变量时,两个变量互不影响,如下array1与array2是两个不同的数组:

        array1 := [10]int64{}
        array2 := array1
        

        在赋值时,只是把array1的内容拷贝到array2中,array1的修改不会再影响array2

        package main
        import (
        	"fmt"
        )
        func main() {
        	array1 := [10]int64{1,2}
        	array2 := [10]int64{}
        	array2 = array1
        	array1[0] = 100         // array2[0] 不会变
        	fmt.Printf("array1:%vn",array1)
                fmt.Printf("array2:%vn",array2)
        }

        运行结果:

        array1:[100 2 0 0 0 0 0 0 0 0]
        array2:[1 2 0 0 0 0 0 0 0 0]

        切片是引用类型,所以当使用一个切片初始化另一个切片时,两个切片实际是同一个。

        package main
        import (
        	"fmt"
        )
        func main() {
        	slice1 := make([]int64, 1, 10)    // 初始化一个len为1,cap为10的切片
        	slice2 := slice1
        	slice1[0] = 1   // slice2[0] 也会变成1
        	fmt.Printf("slice1:%vn",slice1)
        	fmt.Printf("slice2:%vn",slice2)
        }

        运行结果:

        slice1:[1]
        slice2:[1]

        Golang中没有class关键字来定义类,对于事物的抽象以struct来定义,因此一个struct变量可以被看做一个类实例。

        但是这有别于java,因为struct在方法中传参时是值类型而非引用类型,所以当需要在方法内改变这个对象的字段值时,应该使用的是struct变量的指针,而非struct变量。

        type Student struct{
                 Name string
        }
         
        func (s * Student) Set(name string){
                      s.Name = name
        }
        func (s Student) Get()string{
                   return s.Name
        }

        由上可知:

        如果方法内部会修改当前对象的字段或改变其值,需要用指针。

        由于值传递是(内存)复制,因此,如果对象比较大,应该使用指针(地址),避免内存拷贝(值类型等变量指向内存中的值,如果有值类型变量存放大量元素,或造成内存的大量拷贝)。

        注意:不见得使用指针就一定好过传值,因为按照 Go 的内存管理策略,涉及指针和引用的对象会被分配到 GC Heap 上。如果对象很 “小”,显然要比在栈上进行值拷贝 “耗费” 更多。

        以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

        您可能感兴趣的文章:

        • Go语言中的值类型与引用类型的使用
        • Go中的字典Map增删改查、排序及其值类型
        • 一文带你掌握Golang中的值类型和引用类型
        • go语言中值类型和指针类型的深入理解
        • golang值类型转换成[]uint8类型的操作
        • Golang断言判断值类型的实现方法

        站内搜索