Странни дължина на Go стрингове

  1. Изглежда не разбирам нещо фундаментално свързано с Go стринговете. Документацията, както обикновенно, не помага с нищо. Но този път и reverse engineering с четене на Go имплементацията не помогна. Затова ми се иска да питам тук за парче код.

    var out string
    buf := make([]byte, 10*1024)
    // случват се някакви неща с buf, най - вече File.Read
    // и няколко пъти, нека да кажем два, се изпълнява следния ред
        out = out + string(buf)
    // след всичките тези неща искаме да видим какво е станало
    println(out)
    println(len(out))
    

    След всичко това резултата от горните две е, че първия println показва стринга, какъвто очаквам. Но втория за len(out) e 20480 (!словом: двадесет хиляди, четери стотин и осемдесет). Ъх? Стринга, който очаквам е 10-на, 15 символа. И толкова си се показва. strings.TrimSpace нищо не променя. С какво е пълен този стринг? WTF? Как се проверява колко е дълъг стринг наистина? А ако всъщност е пълен с боклуци как да видя? Като спра да се дразня на Go може да напиша и малка програмка, която да демонстрира поведението.

  2. func len(v Type) int

    String: the number of bytes in v.

    func make(Type, size IntegerType) Type

    Slice: The size specifies the length. The capacity of the slice is equal to its length. и тн..

    т.е. всичко си е ок, просто има 0-ли

     fmt.Printf("%#v\n", byte) // []byte{0x0, 0x0, 0x0, ....}
     fmt.Printf("%#v\n", string(byte)) // "\x00\x00\x00...."
    

    А за да ги махнеш тези "\x00" може да използваш

    strings.TrimRight(string(byte), "\x00")
    

Трябва да сте влезли в системата, за да може да отговаряте на теми.