http://golang.org/ref/spec#Comparison_operators
Go支持字符串比较,没有任何特殊功能。Go运行时是否在后台进行工作以比较字符串文字?
如下面的程序集转储所示,runtime.eqstring在进行短路检查以查看两个操作数是否为相同的内存字符串(第11行)之后,将字符串比较从运行时委托给函数(第17行):
runtime.eqstring
$ 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)。