方括号来自哪里?

Bob*_*Bob 5 arrays string formatting go slice

package main

import (
    "fmt"
    "log"
)

func main() {
    a := []string{"abc", "edf"}
    log.Println(fmt.Sprint(a))
}
Run Code Online (Sandbox Code Playgroud)

上面的Go程序将打印以下输出,切片值在方括号内"[]".

2009/11/10 23:00:00 [abc edf]

我想知道在源代码中[]添加到格式化字符串中的位置.

我检查了源代码src/fmt/print.go文件,但找不到执行此操作的确切代码行.

任何人都可以提供一个提示吗?

icz*_*cza 8

您正在打印切片的值.它是格式化/打印的print.go,未导出的功能printReflectValue(),当前行#980:

855 func (p *pp) printReflectValue(value reflect.Value, verb rune, depth int)
                                           (wasString bool) {

        // ...

947     case reflect.Array, reflect.Slice:
            // ...

979         } else {
980             p.buf.WriteByte('[')
981         }
Run Code Online (Sandbox Code Playgroud)

和#995行:

994         } else {
995             p.buf.WriteByte(']')
996         }
Run Code Online (Sandbox Code Playgroud)

请注意,这是针对"常规"切片(如您的[]string),字节切片的处理方式不同:

948         // Byte slices are special:
949         // - Handle []byte (== []uint8) with fmtBytes.
950         // - Handle []T, where T is a named byte type, with fmtBytes only
Run Code Online (Sandbox Code Playgroud)

[]byte在未导出的函数中打印fmtBytes():

533 func (p *pp) fmtBytes(v []byte, verb rune, typ reflect.Type, depth int) {

            // ...

551         } else {
552             p.buf.WriteByte('[')
553         }

            // ...

566         } else {
567             p.buf.WriteByte(']')
568         }
Run Code Online (Sandbox Code Playgroud)