http://golang.org/ref/spec#Comparison_operators

Go支持字符串比较,无需任何特殊功能.Go运行时是否在幕后进行字符串文字比较?

推荐答案

正如您在以下程序集转储中看到的,在短路判断两个操作数是否相同的内存字符串(第11行)之后,字符串比较从运行时委托给runtime.eqstring函数(第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).

Go相关问答推荐

Go汇编器命名为Constants

在nixos上找不到XInput2.h头文件的包

如何在gofiber/websocket/v2中设置状态代码和原因

我怎样才能改进这个嵌套逻辑以使其正常工作并提高性能

Go-如何在递归函数中关闭通道

使用 Golang 获取目录磁盘使用情况

使用goroutines在Golang中验证 struct

从 eBPF LRU 哈希映射中错误驱逐的元素

regex.ReplaceAll 但如果替换则添加相同数量的字符

如何为导入的嵌入式 struct 文字提供值?

在恒等函数中将类型 T 转换为类型 U

fmt.Printf() 标志 '0' 不会被字符串忽略

golang pic.ShowImage 为什么它不生成图像而是向我发送base64值

GqlGen - 在字段解析器中访问查询输入参数

当有多个同名包时如何在vscode中显示golang包完整路径?

有没有办法判断值是否满足接口中定义的类型约束?

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

在 VSCode 中使用命令行参数调试 Go 测试

golangci-lint 的 GitHub 操作失败,无法加载 fmt

comparable和any有什么区别?