为了账号安全,请及时绑定邮箱和手机立即绑定

Go 是如何进行字符串比较的?

Go 是如何进行字符串比较的?

Go
阿晨1998 2021-07-06 13:53:20
http://golang.org/ref/spec#Comparison_operatorsGo 支持字符串比较,无需任何特殊功能。Go 运行时是否在幕后工作以比较字符串文字?
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

正如您在以下程序集转储中看到的那样,runtime.eqstring在进行短路检查以查看两个操作数是否是相同的内存中字符串(第 11 行)之后,字符串比较被委托给运行时(第 17 行)中的一个函数:


$ cat foo.go

package main


func main() {

        a := "hello"

        b := "world"

        _ = a == b

}


$ go tool 6g -S foo.go

--- prog list "main" ---

0000 (foo.go:3) TEXT    main+0(SB),$40-0

0001 (foo.go:3) LOCALS  ,$0

0002 (foo.go:4) LEAQ    go.string."hello"+0(SB),BX

0003 (foo.go:4) MOVQ    (BX),SI

0004 (foo.go:4) MOVQ    8(BX),CX

0005 (foo.go:5) LEAQ    go.string."world"+0(SB),BX

0006 (foo.go:5) MOVQ    (BX),DX

0007 (foo.go:5) MOVQ    8(BX),AX

0008 (foo.go:6) JMP     ,11

0009 (foo.go:6) MOVQ    $1,AX

0010 (foo.go:6) JMP     ,23

0011 (foo.go:6) CMPQ    CX,AX

0012 (foo.go:6) JNE     ,22

0013 (foo.go:6) MOVQ    SI,(SP)

0014 (foo.go:6) MOVQ    CX,8(SP)

0015 (foo.go:6) MOVQ    DX,16(SP)

0016 (foo.go:6) MOVQ    AX,24(SP)

0017 (foo.go:6) CALL    ,runtime.eqstring+0(SB)

0018 (foo.go:6) MOVBQZX 32(SP),BX

0019 (foo.go:6) CMPB    BX,$0

0020 (foo.go:6) JEQ     ,22

0021 (foo.go:6) JMP     ,9

0022 (foo.go:6) MOVQ    $0,AX

0023 (foo.go:7) RET     ,


--- prog list "init" ---

0024 (foo.go:7) TEXT    init+0(SB),$0-0

0025 (foo.go:7) MOVBQZX initdone·+0(SB),AX

0026 (foo.go:7) LOCALS  ,$0

0027 (foo.go:7) CMPB    AX,$0

0028 (foo.go:7) JEQ     ,34

0029 (foo.go:7) CMPB    AX,$2

0030 (foo.go:7) JNE     ,32

0031 (foo.go:7) RET     ,

0032 (foo.go:7) CALL    ,runtime.throwinit+0(SB)

0033 (foo.go:7) UNDEF   ,

0034 (foo.go:7) MOVB    $2,initdone·+0(SB)

0035 (foo.go:7) RET     ,

除非您正在处理编译器或运行时,否则您不必担心太多:只需使用规范定义的运算符,并期望与字符串长度的比较为 O(n)。


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信