Go语言的数据类型

news2024/11/23 9:17:11

博客主页:🏆看看是李XX还是李歘歘 🏆

🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺

💗点关注不迷路,总有一些📖知识点📖是你想要的💗 

目录

Go的数据类型

基本数据类型

复合数据类型

深拷贝和浅拷贝

概念

代码解释

传递


本文会详细讲一下Go的理论知识,包括数据类型,深拷贝和浅拷贝,传递

Go的数据类型

在Go中其数据类型分为基本数据类型和复合数据类型

基本数据类型

布尔型、整型、浮点型、字符型、复数型、字符串

基本数据类型全部都是值类型,都是可比的,但是需要注意的是在Go中字符型有两种表示:byte和rune,详情请参考:Go语言的rune和byte的区别

复合数据类型

非引用类型:数组、结构体
引用类型:指针、切片、映射、通道、函数
接口类型:接口

复合数据类型的可比性(是否可以用==作为判断):

非引用类型:数组、结构体也属于值类型,但是它们的可比性取决于其中变量的可比较性;引用类型中指针和通道是可比的,切片、映射是不可比的,函数可以通过反射获取函数指针进行比较;接口类型是可比较的。

 函数的比较:

package main

import (
    "fmt"
    "reflect"
)

func lcc() {
    fmt.Println(1)
}
func lyh() {
    fmt.Println(1)
}
func main() {
    func1 := reflect.ValueOf(lcc)
    func2 := reflect.ValueOf(lcc)
    func3 := reflect.ValueOf(lyh)
    fmt.Println(func2 == func1)     // true
    fmt.Println(func2 == func3)     // false
}

其中切片、map和channel的知识点可以参考:

(47条消息) Go的Slice和数组_李歘歘的博客-CSDN博客_go slice 元素个数

(47条消息) 浅聊go的map_李歘歘的博客-CSDN博客_go map每次迁移多少数据

(47条消息) 浅聊goroutine和channel_李歘歘的博客-CSDN博客

深拷贝和浅拷贝

概念

深拷贝:拷贝的是数据本身,创造一个样的新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存空间,新对象值修改时不会影响原对象值。既然内存地址不同,释放内存地址时分别释放。

值类型的数据(基本数据类型+复合数据类型的非引用类型),默认全部采用深拷贝。

浅拷贝:拷贝的是数据地址,只复制指向的对象的指针,此时新对象和老对象指向的内存地址是一样的,新对象值修改时老对象也会变化。释放内存地址时,同时释放内存地址。

引用类型的数据,默认全部采用浅拷贝。

引用类型,想实现深拷贝,就不能直接 := ,而是要先 new ,再赋值。slice也可以使用copy函数进行深拷贝。

深拷贝会拷贝数据(两变量存储地址不同,拷贝结束互不影响)。浅拷贝只会拷贝内存的地址(即使拷贝结束,还是互相影响)

代码解释

深拷贝和浅拷贝

package main

import "fmt"

func main() {
	// slice是浅拷贝,改变了a的值,b也会变化,而且内存空间是同一个
	a := []int{1}
	b := []int{2}
	fmt.Println(a[0], &a[0])
	fmt.Println(b[0], &b[0])
	b = a
	a[0] = 3
	fmt.Println(a[0], &a[0])
	fmt.Println(b[0], &b[0])
	fmt.Println("----------------------------")
	// array是深拷贝,改变了c的值,d的值不变,而且内存空间是两个
	c := [1]int{1}
	d := [1]int{2}
	fmt.Println(c[0], &c[0])
	fmt.Println(d[0], &d[0])
	d = c
	c[0] = 3
	fmt.Println(c[0], &c[0])
	fmt.Println(d[0], &d[0])
}

slice实现深拷贝

package main

import "fmt"

func main() {
	// slice的深拷贝实现----copy函数,改变了c的值,d的值不变,而且内存空间是两个
	a := []int{1}
	b := []int{2}
	fmt.Println(a[0], &a[0])
	fmt.Println(b[0], &b[0])
	copy(a, b) // copy是深拷贝
	a[0] = 3
	fmt.Println(a[0], &a[0])
	fmt.Println(b[0], &b[0])
	fmt.Println("----------------------------")
}

传递

官方给的文档说明,go中的所有传递都是值传递,都是一个副本,一个拷贝。

在 go 语言中 值类型赋值都是深拷贝 ,引用类型一般都是浅拷贝。但是实际传递过程中,值类型会生成一个副本进行传递,引用类型会生成一个指针副本进行传递,所以在go中的所有传递都是值传递。

有的同学可能不懂为啥引用类型也是值传递?

引用类型的时候,他们的结构体中并没有直接保存数据,而是保存了指向数据的指针,那么在传递时候,就拷贝了一份它们自己的一份结构体,包括只想地址的指针,结构体里面具体保存的指针指向的地址还是同一份,没有变化的。所以这也就说明函数中为什么可以改变引用类型变量的值了,因为底层指针指向的地址是同一个。

func lcc(a int) {
    fmt.Println(&a)
}
func lyh(a []int) {
    fmt.Println(&a[0])
}

func main() {
    a := 1
    fmt.Println(&a)
    lcc(a)//值类型,复制了一个新的值,所以是一个新的地址
    b := []int{1}
    fmt.Println(&b[0])
    lyh(b)//引用类型,复制了一个指向该地址的指针,所以说地址不变
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

功率放大器模块在超微晶合金磁特性测量研究中的应用

客户需求:对超微晶合金磁特性测量中的波形发生与控制问题进行研究,实验系统有严格的体积要求,上位机可外置,测试系统需集成于机箱,机箱尺寸:1900mm500mm600mm。 解决方案:功率放大器模块采用安泰…

Golang的error和panic

博客主页:🏆看看是李XX还是李歘歘 🏆 🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺 💗点关注不迷路,总有一些📖知…

Python入门自学进阶-Web框架——30、DjangoAdmin项目应用-自定义用户认证续

一、前面实现的是DjangoAdmin实现的自定义用户认证管理,现在自己来实现管理功能,即在mytestapp中增加用户认证管理功能。 在UserProfile的model中,对password字段增加help_text属性: password models.CharField(_(password), m…

Linux 环境安装 jdk 或 openjdk

一、linux 环境安装JDK的tar.gz包,通用命令: 1、查看已安装的JDK版本rpm -qa | grep jdk2、删除不需要的JDK版本:rpm -e --nodeps java-1.8.0-openjdk3、解压新JDK至/usr/lib/jvm目录下tar -zxvf openjdk-1044_linux-x64_bin_ri.tar.gz -C /…

AOSP刷机笔记

下载官方镜像,下载对应AOSP,编译出的*.img替换到官方镜像对应的文件, 刷入 把证书放到aosp源码的system/ca-certificates/files文件夹里,lunch aosp_sailfish-user编译可以实现无root抓包 mkdir ~/bin PATH~/bin:$PATH curl -sSL https://ger…

什么是集中采购 集中采购管理软件介绍

什么是集中采购? 集中采购是指企业总部某特定部门对企业所有采购进行管控,他们负责获取整个组织需要的物资。这个部门负责与供应商联络、供应商寻源、合同管理、风险分析,以及从供应商那里获得所需物资的每项工作。 企业采用集中采购管理模…

什么叫joinquant量化策略?

joinquant量化主要是在数据挖掘上有特别的意义,不像平时我们在执行各个量化选股策略时,还要一个一个去输入去查询。而joinquant量化策略在开发方面就简便了很多,joinquant量化策略是运用到个股量化交易中能够针对各个股票数据都能快速挖掘出来…

mongodb安装和部署,并整合到Springboot

mongodb安装和部署,并整合到Springboot 1.linux上docker安装mongodb docker pull mongo:4.4.18使用docker命令启动: docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:4.4.18运行容器 docker exec -it mongo /bin/bash# 进入…

C进阶_字符串查找库函数

strstr 查找strstr的文档,可知它的原型为: char *strstr( const char *string, const char *strCharSet ); 它的返回值,根据文档是这样的: Return Value Each of these functions returns a pointer to the first occurrence …

使用 YonBuilder 进行报表分析 - 扩展篇

使用 YonBuilder 进行报表分析 - 扩展篇 在上一篇文章中,我们讲解了如何构建简单的报表以及交叉表的基础配置。本篇文章通过对主子表、树型表以及数据穿透的创建来对 YonBuilder 的报表配置进行扩展介绍。 创建报表 首先,要先创建一个员工信息实体&…

CSS选择器整理学习(中)

书接上回,在前端项目开发中,有时候需要对特殊的元素进行特殊的处理,但有时候元素的位置不确定、层级不确定、数量不确定等问题,导致我们没办法进行元素的选择,这个时候我们就需要用到元素选择器了。 一、CSS选择器 1…

加油站视频监控智能分析盒基于yolov5

加油站视频监控智能分析盒基于yolov5人工智能视觉技术,对现场画面中明火和烟雾以及人员抽烟、打电话等违规行为进行识别。除此之外,还可以对现场画面中卸油时灭火器未按要求正确摆放以及静电释放时间不足和人员离岗等不规范行为进行自动预警。YOLOv5在YO…

【云原生】k8s图形化管理攻击之rancher

内容预知 前言 1. Rancher的相关知识 1.1 Rancher的简介 1.2 Rancher与k8s的关系及区别 1.3 Rancher具有的优势 2. Rancher的安装部署 2.1 实验环境与部署图分配 2.2 具体的部署操作 (1)在 rancher 节点下载 rancher 镜像 (2&#xff…

程序员同事每天准点下班,原来是用了这6个开发工具

工欲善其事必先利其器,要想更加高效的做事情,就得先将工具变得锋利。那么对于程序员来说同样也是如此,如果要想每天早点下班,就必须借助于一些开发工具来提高自己的工作效率,今天就给大家总结一些工作中常用到的工具。…

【算法题解】11. 判断链表是否有环,并返回入环节点

文章目录题目解法一:循环标记Java代码实现Go 代码实现复杂度分析解法二:快慢指针Java 代码实现Go 代码实现复杂度分析这是一道 中等难度 的题,是 判断链表是否有环 的扩展,在有环的情况下返回入环节点, 依然是两种解法…

Disney 流媒体广告 Flink 的应用实践

摘要:本文整理自 Disney 广告智能执行总监郝又超、Disney 广告智能实时计算负责人李丁哲,在 FFA 主会场的分享。本篇内容主要分为四个部分:Disney 流媒体广告与实时应用业务场景实现实时平台构建未来展望Tips:点击「阅读原文」查看…

kafka.2 集群搭建

文章目录1.启动kakfa自带的zk2.启动kafka集群3.查看zookeeper的kafka节点信息启停kafka集群脚本创建主题增加分区模拟生产消费模拟消费组消费主题,查看offset1.启动kakfa自带的zk 参考:https://blog.csdn.net/justlpf/article/details/127261664?utm_m…

通俗易懂的java设计模式(7)-原型模式

1.什么是原型模式? 原型模式提供了一种创建对象的模式,它是指用原型实例创建对象的种类,并且通过拷贝这些原型,创建新的对象。用一个很生动形象的例子:孙悟空拔出一根猴毛,变出其他和自己一模一样的小孙悟…

Linux三剑客之Sed

目录 一、认识sed 二、使用sed 命令格式 常用选项options 地址定界 编辑命令command sed用法 常用选项: 地址界定演示 编辑命令command演示 sed高级编辑命令 一、认识sed sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行…

《Linux Shell脚本攻略》学习笔记-第九章

9.1 简介 计算机系统是由一组硬件及控制这些硬件的软件组成的。 Linux既提供了能够检查这些系统当前性能的交互式程序,也提供了用于记录一段时间内系统性能表现的模块。 9.2 监视磁盘使用情况 磁盘空间是一种有限的资源。 du和df命令可以报告磁盘使用情况&#xff0…