【问题标题】:Where do the square brackets come from?方括号从何而来?
【发布时间】:2016-10-30 15:08:55
【问题描述】:
package main

import (
    "fmt"
    "log"
)

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

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

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

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

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

谁能给个提示?

【问题讨论】:

    标签: arrays string go formatting slice


    【解决方案1】:

    您正在打印切片的值。它被格式化/打印在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         }
    

    和第 995 行:

    994         } else {
    995             p.buf.WriteByte(']')
    996         }
    

    请注意,这是针对“一般”切片(如您的 []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
    

    []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         }
    

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 2015-06-26
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2019-10-21
      相关资源
      最近更新 更多