2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個贊
正如您在以下程序集轉(zhuǎn)儲中看到的那樣,runtime.eqstring在進(jìn)行短路檢查以查看兩個操作數(shù)是否是相同的內(nèi)存中字符串(第 11 行)之后,字符串比較被委托給運(yùn)行時(第 17 行)中的一個函數(shù):
$ 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 ,
除非您正在處理編譯器或運(yùn)行時,否則您不必?fù)?dān)心太多:只需使用規(guī)范定義的運(yùn)算符,并期望與字符串長度的比較為 O(n)。
- 2 回答
- 0 關(guān)注
- 222 瀏覽
添加回答
舉報(bào)