我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Golang数据类型实例代码比较分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Golang数据类型实例代码比较分析

这篇文章主要讲解了“Golang数据类型实例代码比较分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang数据类型实例代码比较分析”吧!

分类说明是否能比较说明
基本类型整型( int/uint/int8/uint8/int16/uint16/int32/uint32/int64/uint64/byte/rune等)浮点数( float32/float64)复数类型( complex64/complex128)字符串( string)
引用类型切片(slice)、map
聚合类型(复合类型)数组相同长度的数组可以比较,不同长度的数组不能进行比较

结构体只包含可比较的类型情况下可比较
接口类型如error

 基本数据类

  • 类型一致且是基本类型,值相等的时候,才能==

  • 非基本类型会panic panic: runtime error: comparing uncomparable type []int

浮点比较

不过基本类型中也要注意浮点型的比较就不像我们现实中的一样,比如0.1+0.2在计算中运行结果就不是0.3了,而是0.30000000000000004了

package main import "fmt" func main() {         var a float64=0.1         var b float64=0.2         // 0.30000000000000004         fmt.Println(a+b) }

字符串比较

一般的比较运算符(==、!=、<、<=、>=、>)是通过在内存中按字节比较来实现字符串比较的,因此比较的结果是字符串自然编码的顺序。字符串所占的字节长度可以通过函数 len() 来获取,例如 len(str)

比较两个字符是否相等

package golangbaseimport ("fmt""testing")func TestString(t *testing.T) {str1 := "哈哈"str2 := "哈哈"fmt.Println(str1 == str2)}

输出结果为true

引用类型

slice、map

  • 切片之间不允许比较。切片只能与nil值比较

  • map之间不允许比较。map只能与nil值比较

  • 两个nil也不能比较,会panic

slice、map比较

使用reflect.DeepEqual()

对比规则

  • 相同类型的值是深度相等的,不同类型的值永远不会深度相等。

  • 当数组值(array)的对应元素深度相等时,数组值是深度相等的。

  • 当结构体(struct)值如果其对应的字段(包括导出和未导出的字段)都是深度相等的,则该值是深度相等的。

  • 当函数(func)值如果都是零,则是深度相等;否则就不是深度相等。

  • 当接口(interface)值如果持有深度相等的具体值,则深度相等。

  • 当切片(slice)序号相同,如果值,指针都相等,那么就是深度相等的

  • 当哈希表(map)相同的key,如果值,指针都相等,那么就是深度相等的。

使用示例

package golangbaseimport ("reflect""testing")type StructA struct {Name  stringHobby []string}type StructB struct {Name string}func TestDeepEqual(t *testing.T) {s1 := StructA{Name: "test", Hobby: []string{"唱", "跳"}}s2 := StructA{Name: "test", Hobby: []string{"唱", "跳"}}println(reflect.DeepEqual(s1, s2))// truemp1 := map[int]int{1: 10, 2: 20}mp2 := map[int]int{1: 10, 2: 20}println(reflect.DeepEqual(mp1, mp2))// true}

channel、指针

指针可比较,只要指针指向的地址一样,则相等

由于通过make创建channel后,返回的是一个指针,所以可以比较

c1 := make(chan int, 2)  c2 := make(chan int, 2)  c3 := c1  fmt.Println(c3 == c1) // true  fmt.Println(c2 == c1) // false

聚合类型

数组

数组在go中是必须先确定长度的,也就是长度不能再去扩容。并且它是个值拷贝,做参数传到一个函数中被修改,那么外部的值还是一样的不变的。Slice则相反。那么数组是否可以比较呢,看下面的例子:

package mainimport "fmt"func main() {    a := [2]int{1, 2}    b := [2]int{1, 2}    c := [2]int{1, 3}    d := [3]int{1, 2, 4}    fmt.Println(a == b) // true    fmt.Println(a == c) // false    fmt.Println(a == d) // invalid operation: a == d (mismatched types [2]int and [3]int)}

可以看出,相同长度的数组是可以比较的,而不同长度的数组是不能进行比较的。原因是什么呢?这是因为数组类型中,数组的长度也是类型的一部分,不同长度的数组那么他们的类型也就被认为不同的,所以无法比较

结构体

只包含可比较的类型情况下可比较

package mainimport "fmt"type A struct {    id int    name string}func main() {    a := A{id:5,name:"123"}    b := A{id:5,name:"123"}    c := A{id:5,name:"1234"}    fmt.Println(a == b) // true    fmt.Println(a == c) // false}

反例,因为slice不可比较,如果结构体包含了slice,则不可比较

package mainimport "fmt"type A struct {    id int    name string    son []int}func main() {    a := A{id:5,name:"123",son:[]int{1,2,3}}    b := A{id:5,name:"123",son:[]int{1,2,3}}    fmt.Println(a == b) // invalid operation: a == b (struct containing []int cannot be compared)}

接口

Go 语言根据接口类型是否包含一组方法将接口类型分成了两类:

  • 使用 runtime.iface结构体表示包含方法的接口

  • 使用 runtime.eface结构体表示不包含任何方法的 interface{} 类型

type eface struct { // 16 字节    _type *_type    data  unsafe.Pointer}type iface struct { // 16 字节    tab  *itab    data unsafe.Pointer}

一个接口值是由两个部分组成的,即该接口对应的类型和接口对应具体的值

接口值的比较涉及这两部分的比较,只有当类型和值都相等(动态值使用==比较),两个接口值才是相等的。看个例子:

var a interface{} = 0var b interface{} = 2var c interface{} = 0var d interface{} = 0.0fmt.Println(a == b) // falsefmt.Println(a == c) // truefmt.Println(a == d) // false

a和c类型相同(都是int),值也相同(都是0,基本类型比较),故两者相等。 a和b类型相同,值不等,故两者不等。 a和d类型不同,a为int,d为float64,故两者不等

最后做个练习

func TestJson(t *testing.T) {var x, y Datax = Data{UUID:    "856f5555806443e98b7ed04c5a9d6a9a",Content: 1,}bytes, _ := json.Marshal(x)_ = json.Unmarshal(bytes, &y)println(x)println(y)println(reflect.DeepEqual(x, y))}

为什么结果为false?

debug看一下

Golang数据类型实例代码比较分析

原因是json.Unmarshal默认会将所有的数字类型转为float64

Golang数据类型实例代码比较分析

针对这种情况,可以封装一个DeepEqual方法

func DeepEqual(v1, v2 interface{}) bool {if reflect.DeepEqual(v1, v2) {return true}bytesA, _ := json.Marshal(v1)bytesB, _ := json.Marshal(v2)return bytes.Equal(bytesA, bytesB)}![在这里插入图片描述](https://img-blog.csdnimg.cn/55d294d1ab7740aba7b547d1a6165b5a.png)

感谢各位的阅读,以上就是“Golang数据类型实例代码比较分析”的内容了,经过本文的学习后,相信大家对Golang数据类型实例代码比较分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Golang数据类型实例代码比较分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Golang数据类型实例代码比较分析

这篇文章主要讲解了“Golang数据类型实例代码比较分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang数据类型实例代码比较分析”吧!分类说明是否能比较说明基本类型整型( int/
2023-07-06

golang函数类型的性能比较分析

在 go 语言中,函数类型对性能有显著影响。性能比较显示,普通函数最优(147.08 m ops),其次是匿名函数(158.01 m ops),最后是闭包(10.02 m ops)。这些类型在不同场景中有不同的优势:匿名函数适合回调,闭包适
golang函数类型的性能比较分析
2024-04-28

Golang数据类型比较详解

这篇文章主要围绕Golang数据类型比较详细展开,文中有详细的比较过程,需要的朋友可以参考一下
2023-05-15

Redis数据结构类型实例代码分析

这篇“Redis数据结构类型实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Redis数据结构类型实例代码分析”文
2023-07-05

Python数字类型实例代码分析

这篇文章主要介绍了Python数字类型实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python数字类型实例代码分析文章都会有所收获,下面我们一起来看看吧。Python 数字类型Python 中有三
2023-07-06

Go语言基础数据类型实例代码分析

这篇文章主要讲解了“Go语言基础数据类型实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言基础数据类型实例代码分析”吧!布尔型布尔型是Go最简单的数据类型,因为布尔型只有两个
2023-07-05

javascript数据类型基础示例代码分析

这篇文章主要讲解了“javascript数据类型基础示例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript数据类型基础示例代码分析”吧!js中的输入输出语句方法说明归
2023-06-29

PHP类型转换实例代码分析

今天小编给大家分享一下PHP类型转换实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。基本数据类型首先,我们需要了解
2023-07-05

TypeScript类型级别实例代码分析

本篇内容介绍了“TypeScript类型级别实例代码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码如下:/** * Try assi
2023-07-05

Python数据类型实例分析

本篇内容主要讲解“Python数据类型实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python数据类型实例分析”吧!一、内容概要字符串(str)列表(list)元组(tup)字典(di
2023-06-02

Go数据类型实例分析

本篇内容介绍了“Go数据类型实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!每一个变量都有数据类型,Go中的数据类型有:简单数据类型:
2023-06-30

Python内建类型bytes实例代码分析

这篇文章主要讲解了“Python内建类型bytes实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python内建类型bytes实例代码分析”吧!1 bytes和str之间的关系不
2023-06-30

ECMAScript数据类型之Number类型实例分析

这篇文章主要介绍“ECMAScript数据类型之Number类型实例分析”,在日常操作中,相信很多人在ECMAScript数据类型之Number类型实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ECM
2023-06-30

Ajax的数据类型实例分析

今天小编给大家分享一下Ajax的数据类型实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在 Ajax 的使用中,遇到了
2023-06-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录