Go语言中的值类型和引用类型特点

server/2025/1/30 3:47:37/

一、值类型

值类型的数据直接包含值,当它们被赋值给一个新的变量或者作为参数传递给函数时,实际上是创建了原值的一个副本。这意味着对新变量的修改不会影响原始变量的值。

Go中的值类型包括:

  • 基础类型:int,float64,bool,string等。
  • 数组([N]Type):固定大小的元素序列,所有元素必须同一类型。
  • 结构体(struct): 自定义的复合类型。

测试:传入上述值类型是否能改变原始变量值

package mainimport "fmt"func modifyString(str string) {str = "字符串222"
}// 注意这里arr 类型为[5]int,因为数据长度是数组类型的一部分
func modifyArr(arr [5]int) {arr[0] = 100
}type User struct {name stringage  int
}func modifyUser(user User) {user.age = 20
}func main() {// 测试stringstrstr := "字符串111"modifyString(strstr)fmt.Println(strstr)//测试数组arr := [5]int{1, 2, 3, 4, 5}modifyArr(arr)fmt.Println(arr)// 测试结构体user := User{name: "xiaoming",age:  18,}modifyUser(user)fmt.Println(user)
}

输出:

 

二、引用类型


引用类型不存储值本身,而是存储一个指向实际值的地址。当你将引用类型的变量赋值给新的变量或传递给函数时,你实际上是在共享同一个底层数据。因此,通过任何持有引用的变量所做的更改都将反映在其他所有引用上。

Go中的引用类型包括:

  • 切片(slice)
  • 映射(map)
  • 通道(channel)
  • 指针(pointer) 

测试:传入上述引用类型能否改变原始的值

package mainimport ("encoding/json""fmt"
)func modifySlice(slice []int) {slice[0] = 100
}func modifyMap(customeMap map[string]string) {customeMap["a"] = "xxx"
}func modifyChannel(ch chan int) {// 向channel发送数据ch <- 42
}func modifyPtr(ptr *int) {*ptr = 20 // 修改指针指向的值
}func main() {// 测试切片slice := []int{1, 2, 3}modifySlice(slice)fmt.Println(slice)// 测试mapcustomeMap := map[string]string{"a": "a","b": "b",}modifyMap(customeMap)jsonBytes, err := json.Marshal(customeMap)if err != nil {fmt.Println(err)}fmt.Println(string(jsonBytes))// 测试channel// 创建一个无缓冲的channel,用于传输int类型的数据ch := make(chan int)// 开启一个新的goroutine,在其中调用modifyChannel函数go modifyChannel(ch)// 从channel接收数据并打印value := <-chfmt.Println("channel接收数据:", value)// 测试指针var ptr *int = new(int)fmt.Println("ptr初始值:", *ptr)modifyPtr(ptr)fmt.Println("ptr修改后:", *ptr)}

输出:


http://www.ppmy.cn/server/163390.html

相关文章

视频外绘技术总结:Be-Your-Outpainter、Follow-Your-Canvas、M3DDM

Diffusion Models专栏文章汇总:入门与实战 前言:视频Inpaint的技术很火,但是OutPaint却热度不高,这篇博客总结比较经典的几篇视频Outpaint技术。其实Outpaint在runway等工具上很火,可是学术界对此关注比较少,博主从这三年的顶会中找到了最具代表性的三篇论文解读。 目录 …

Python Matplotlib库:从入门到精通

Python Matplotlib库&#xff1a;从入门到精通 在数据分析和科学计算领域&#xff0c;可视化是一项至关重要的技能。Matplotlib作为Python中最流行的绘图库之一&#xff0c;为我们提供了强大的绘图功能。本文将带你从Matplotlib的基础开始&#xff0c;逐步掌握其高级用法&…

C语言练习(29)

13个人围成一圈&#xff0c;从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子&#xff0c;找出最后留在圈子中的人原来的序号。本题要求用链表实现。 #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int num;struct Nod…

Electron学习笔记,安装环境(1)

1、支持win7的Electron 的版本是18&#xff0c;这里node.js用的是14版本&#xff08;node-v14.21.3-x86.msi&#xff09;云盘有安装包 Electron 18.x (截至2023年仍在维护中): Chromium: 96 Node.js: 14.17.0 2、安装node环境&#xff0c;node-v14.21.3-x86.msi双击运行选择安…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现&#xff08;轻量级实现&#xff09;。 分布式网关的特点&#xff08;相对于本地网关&#xff09;&#xff1a; 提供服务路由能力提供各种拦截支持 1、分布式网关推荐 建议使用专业的分布式网关产品&#xff0…

【452. 用最少数量的箭引爆气球 中等】

题目&#xff1a; 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

Kafka常见问题之 `javax.management.InstanceAlreadyExistsException`

文章目录 Kafka常见问题之 javax.management.InstanceAlreadyExistsException1. 概述2. 常见原因3. 具体异常示例4. 解决方案4.1 确保单一 Kafka Producer 实例4.2 配置 Kafka Broker 和 Producer 使用唯一的 JMX 名称&#xff08;对于Producer重点检查 client.id&#xff09;4…

【汽车电子架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子架构&#xff1a;AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风&#xff0c;从概念与定义入手&#xff0c;希望读者能对AutoSAR架构有一个整体的认识&#xff0c;然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…