2016-06-28 8 views
5
package main 

import (
    "fmt" 
    "log" 
) 

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

上記のGoプログラムは、角括弧"[]"の中にスライス値を入れた次の出力を出力します。角括弧はどこから来たのですか?

2009年11月10日午後11時00分○○秒[ABCのEDF]

そして私は[]がフォーマット文字列に追加されていることをどこソースコードに知ってほしいです。

私はソースコードsrc/fmt/print.goファイルを確認しましたが、これを行う正確なコード行が見つかりませんでした。

誰でもヒントを提供できますか?

答えて

8

スライスの値を印刷しています。これは、(あなたの[]stringのような) "一般" のスライスのためであることを

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

注:

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:print.go、アンエクスポート機能printReflectValue()、現在のライン#980で印刷/フォーマットされ、バイトスライスは異なる方法で処理されています

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はアンエクスポート機能に印刷されています:

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   } 
+0

すばらしい指摘に感謝します。 – Bob

関連する問題