一道比较运算符相关的面试题把我虐的体无完肤

来自公众号:新世界杂货铺

杂(货铺)谈

今天这篇文章相对来说比较基础,大家花几分钟时间看看,有所收获自然是最好,没有收获也就消磨几分钟时间罢了,你不亏,笔者也不亏~

前几期还是有一定难度的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)
st
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值