每次学习并整理一个Golang的知识点,每天进步一点点。今天来学习下结构体的一个知识点🤔。

代码片段

观察如下代码片段,判断能否编译通过;如果可以,写出输出结果?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import (
	"fmt"
)

type s struct {
	name string
	age  int
}

type m struct {
	age  int
	dict map[string]string
}

func main() {
	s1 := s{"xujpxm", 18}
	s2 := s{"xujpxm", 18}
	if s1 == s2 {
		fmt.Println("s1 == s2")
	} else {
		fmt.Println("s1, s2 不相等")
	}

	m1 := m{18, map[string]string{"name": "xujpxm"}}
	m2 := m{18, map[string]string{"name": "xujpxm"}}
	if m1 == m2 {
		fmt.Println("m1 == m2")
	} else {
		fmt.Println("m1, m2不相等")
	}

}

思考后看答案

思考后看答案


答疑解惑

编译不通过。 输出结果:invalid operation: m1 == m2 (struct containing map[string]string cannot be compared)

上面代码里s1 == s2是成立的,但m1 == m2处编译不通过,因为结构体里里map无法进行比较;

这道题目考的是结构体的比较,需要注意几点:

  • 结构体只能比较是否相等,但是不能比较大小
  • 相同类型的结构体才能够进行比较,结构体是否相同不但与属性类型有关,还与属性顺序相关;例如下面的s3 与 s1 就是不同的结构体;
1
2
3
4
    s3:= struct {
        age  int
        name string
    }{age:18,name:"xujpxm"}
  • 如果结构体的所有成员都可以比较,则该结构体就可以通过 ==!= 进行比较是否相等,比较时逐个项进行比较,如果每一项都相等,则两个结构体才相等,否则不相等;

那什么是可比较的呢,常见的有 bool、数值型、字符、指针、数组等,像slice、map(只能与nil值比较)、function等是不能比较的。 具体可以参考 Go 说明文档。http://docs.studygolang.com/ref/spec#Comparison_operators

其他相关答案,欢迎在评论区留言补充!

下期提问

观察如下代码片段,判断能否编译通过;如果可以,写出输出结果?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import "fmt"

type myInt1 int
type myInt2 = int

func main() {
	var num int = 0
	var i1 myInt1 = num
	var i2 myInt2 = num
	fmt.Println(i1, i2)
}

答案及解析将在下期文章中给出,欢迎大家在评论区留言,独乐乐不如众乐乐,交流学习,互相进步。


欢迎转发和评论。更多优质原创文章,欢迎关注微信公众号“IYue爱月”或扫描下方二维码:

xujpxm_qrcode_gh