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

 更新时间:2025年07月03日 10:42:56   作者:alden_ygq  
这篇文章主要介绍了go之值类型与引用类型使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1 概述

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

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

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

2案例

2.1 值类型

数组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:%v\n",array1)
        fmt.Printf("array2:%v\n",array2)
}

运行结果:

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

2.2 引用类型

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

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:%v\n",slice1)
	fmt.Printf("slice2:%v\n",slice2)
}

运行结果:

slice1:[1]
slice2:[1]

3 golang中的struct类型

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 上。如果对象很 “小”,显然要比在栈上进行值拷贝 “耗费” 更多。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文详解Golang中的匿名变量

    一文详解Golang中的匿名变量

    匿名变量是一种特殊类型的变量,可以简化代码并提高可读性,本文将为大家详细介绍一下golang中匿名变量的定义、特性和使用方法,需要的可以参考下
    2023-09-09
  • 详解Golang time包中的结构体time.Time

    详解Golang time包中的结构体time.Time

    在日常开发过程中,会频繁遇到对时间进行操作的场景,使用 Golang 中的 time 包可以很方便地实现对时间的相关操作,本文先讲解一下 time 包中的结构体 time.Time,需要的朋友可以参考下
    2023-07-07
  • Go语言题解LeetCode463岛屿的周长示例详解

    Go语言题解LeetCode463岛屿的周长示例详解

    这篇文章主要为大家介绍了Go语言题解LeetCode463岛屿的周长示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Golang Gin局部和全局中间件使用详解

    Golang Gin局部和全局中间件使用详解

    中间件是放在客户端和服务端的中间,当你的客户端对某个接口发起一个请求,但是在到达接口2之前,这里是有一层中间件的处理。本文详细介绍了Golang Gin局部、全局中间件使用方法,感兴趣的同学可以阅读本文
    2023-04-04
  • 在goland中读取tpl文件的图文操作

    在goland中读取tpl文件的图文操作

    这篇文章主要介绍了在goland中读取tpl文件的图文操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言常见错误接口污染解决分析

    Go语言常见错误接口污染解决分析

    这篇文章主要为大家介绍了Go语言常见错误接口污染解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • go mod tidy报错:zip: not a valid zip file解决办法

    go mod tidy报错:zip: not a valid zip file解决办法

    这篇文章主要给大家介绍了关于go mod tidy报错:zip: not a valid zip file的解决办法,go mod是进行代码管理,这错误是因为本地分支和远程分支冲突,本文通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 浅谈go中cgo的几种使用方式

    浅谈go中cgo的几种使用方式

    本文主要介绍了浅谈go中cgo的几种使用方式,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • go 协程返回值处理操作

    go 协程返回值处理操作

    这篇文章主要介绍了go 协程返回值处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go Gin实现文件上传下载的示例代码

    Go Gin实现文件上传下载的示例代码

    这篇文章主要介绍了Go Gin实现文件上传下载的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论