分享
  1. 首页
  2. 文章

Go语言==真的那么简单吗

ZhDavis · · 1860 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1.背景介绍:


笔者最近发现对于Go的struct在使用==的时候,有时候可以使用,有时候却不能使用,甚至编译出错。基于这个既定事实,笔者做了一次实现,便整理了这篇文章出来。

struct使用==的例子如下所示:

场景1:==可以使用

package main
import ( "fmt")
type node struct { Name string Age int}
func main() { n1 := node{Name: "hello", Age: 10} n2 := node{Name: "hello", Age: 10} if n1 == n2 { fmt.Println("n1==n2") }}

Output:

n1==n2

场景2: ==使用不成功

package main
import ( "fmt")
type node1 struct { Name string Age *int}
func main() { var a1, a2 int = 10, 10 n3 := node1{Name: "hello", Age: &a1} n4 := node1{Name: "hello", Age: &a2} if n3 == n4 { fmt.Println("n3==n4") } else { fmt.Println("n3!=n4") } n4.Age = &a1 if n3 == n4 { fmt.Println("n3==n4") } else { fmt.Println("n3!=n4") }}

Output:

n3!=n4n3==n4

执行结果分析:

通过场景1和场景2的输出结果来看,在struct内部是基本类型的时候,==是可以使用的,并且判断的结果也是正确的。然而,在struct内部含有指针的时候,就算指针里面的取值是相同的,==执行结果也认为是不同的,这与我们使用==的初衷并不相同,并且在指针指向同一个存储位置的时候,==执行的结果又是正确的。

(备注:这个其实是由于struct只是比较指针的地址是否相同来判定==是否一致的,并没有去比较指针指向地址中的数值是否相同,有点类似C++中的深copy和浅copy的情况)。

2. ==的详细使用场景总结:

1)基本类型的

对于基本类型,==判断都是没有问题的,Go支持的很好,例子如下:

package main
import ( "fmt")
func main() { var a, b int fmt.Println(a == b) var a1, b1 float64 fmt.Println(a1 == b1) var a2, b2 string = "hello", "hello" fmt.Println(a2 == b2)}

output:

truetruetrue

2) slice和数组的

package mainimport ( "fmt")func main() { strs1 := []string{"hello"} strs2 := []string{"hello"} if strs1 == strs2 { fmt.Println("str1 == str2") }}

output: // 竟然都编译不过

./prog.go:10:11: invalid operation: strs1 == strs2 (slice can only be compared to nil)

数组的==操作

package mainimport ( "fmt")func main() { strs1 := [2]string{"hello"} strs2 := [2]string{"hello"} if strs1 == strs2 { fmt.Println("str1 == str2") }}

output: // 数组就能成功使用==,原因是数组在Go中被认为是基本类型

str1 == str2

3)对于指针,map,interface的使用

package mainimport ( "fmt")func main() { var strs1,strs2 map[int]bool = make(map[int]bool),make(map[int]bool)
 if strs1 == strs2 { fmt.Println("str1 == str2") }}

output: // map的执行结果与slice一致

./prog.go:10:11: invalid operation: strs1 == strs2 (map can only be compared to nil)

对于指针,背景知识里面已经说过,比较的是指针的地址是不是相同,不会去比较指针指向内存中的数值。

对于接口的==比较,可以参考我的另外一篇文章:接口的nil != nil

原文:https://mp.weixin.qq.com/s/LVNtr0EuenbCZ9JN6Qx3fw

公众号:灰子学技术


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1860 次点击
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏