来自公众号:新世界杂货铺
文章目录
杂(货铺)谈
今天这篇文章相对来说比较基础,大家花几分钟时间看看,有所收获自然是最好,没有收获也就消磨几分钟时间罢了,你不亏,笔者也不亏~
前几期还是有一定难度的HTTP系列文章,今天却是画风突变讲起了基础,这当然是因为基础重要呀。正所谓万丈高楼平地起,我们夯实基础,楼才能建的高,毕竟精美的小矮楼总是很容易被高楼遮挡。嗨,扯远了,总之笔者今天写这篇文章绝对不是下面这个原因:
累呀!真的累!工作嘛?当然不是!前几期分析HTTP系列文章确实耗费了太多精力,周末连续熬夜就算是铁打的人也扛不住,所以本周只有养精蓄锐这一个目的。
杂(货铺)言
Go中的比较操作符,你真的了解吗?假如面试官问你下面输出什么,你的答案是什么?
type blankSt struct {
a int
_ string
}
var (
bst1 = blankSt{
1, "333"}
bst2 = blankSt{
1, "44444"}
)
fmt.Println(bst1 == bst2)
今天,笔者总结了一份比较运算符的相关文档,助力读者夯实基础(上述答案请参考后文)。
基本定理
在Go中,比较运算符也是遵循定理的, 两条基本定理如下:
定理一:相等运算符==
和!=
适用于具有可比性的操作数,排序运算符<
,<=
,>
和>=
适用于可排序的操作数。
定理二:在任何比较中,至少满足一个操作数能赋值给另一个操作数类型的变量。
常见类型的比较
常见类型的比较大家都懂,在这里笔者就不详细介绍了,仅枚举一下原则加深大家的印象:
- 布尔值是可比较的,但不可排序,即仅适用于
==
和!=
运算符。 - 整数和浮点数是可比较的且可排序,适用于所有比较运算符。
- 字符串的值是可比较的,且按字节排序,即比较时按字节比较大小(不理解字符串和字节切片关系的,请参考深入理解go中字符串这篇文章)。
以上即为常见类型的比较原则,下面我们结合例子逐步理解各种类型之间的比较。
不可比较的类型
在Go中,切片
,map
,和func
是不可比较的,他们仅可以和预声明表示符nil
进行比较。能和nil进行比较的还有指针
,管道
和interface{}
。
复数之间的比较
复数可比较但不可排序,实部和虚部均相等两个复数才相等。复数仅适用==
和!=
这两个比较运算符:
var c1 complex128 = complex(1, 2) // 1+2i
var c2 complex128 = complex(3, 4) // 3+4i
fmt.Println(c1 == c2)
上述输出结果为false
,证明复数之间可比较。
var c1 complex128 = complex(1, 2) // 1+2i
var c2 complex128 = complex(3, 4) // 3+4i
fmt.Println(c1 >= c2)
此时程序无法运行,在vscode中的错误提醒为cannot compare c1 >= c2 (operator >= not defined for complex128)compiler
。由此确认复数不可排序。
结构体之间的比较
如果结构体的所有字段都是可比较的,则他们所有非匿名字段的值相等,结构体的值才相等。验证如下:
type canC struct {
c int
}
var st1, st2 canC
fmt.Println(st1 == st2)
st1<