前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言==真的那么简单吗

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

作者头像
灰子学技术
发布2023-10-30 15:51:46
1100
发布2023-10-30 15:51:46
举报
文章被收录于专栏:灰子学技术灰子学技术

1.背景介绍:

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

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

场景1:==可以使用

代码语言:javascript
复制
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:

代码语言:javascript
复制
n1==n2

场景2: ==使用不成功

代码语言:javascript
复制
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:

代码语言:javascript
复制
n3!=n4
n3==n4

执行结果分析:

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

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

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

1)基本类型的

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
true
true
true

2) slice和数组的

代码语言:javascript
复制
package main
import (
  "fmt"
)
func main() {
  strs1 := []string{"hello"}
  strs2 := []string{"hello"}
  if strs1 == strs2 {
    fmt.Println("str1 == str2")
  }
}

output: // 竟然都编译不过

代码语言:javascript
复制
./prog.go:10:11: invalid operation: strs1 == strs2 (slice can only be compared to nil)

数组的==操作

代码语言:javascript
复制
package main
import (
  "fmt"
)
func main() {
  strs1 := [2]string{"hello"}
  strs2 := [2]string{"hello"}
  if strs1 == strs2 {
    fmt.Println("str1 == str2")
  }
}

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

代码语言:javascript
复制
str1 == str2

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

代码语言:javascript
复制
package main
import (
  "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一致

代码语言:javascript
复制
./prog.go:10:11: invalid operation: strs1 == strs2 (map can only be compared to nil)

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档