空字符串,但是len是500字节

I can't figure out why an empty string turns out to be 506 bytes long.

So what happens is that I print a string to screen like this:

fmt.Printf("The last element '%s' ", messages[1])

and I get:

The last element ''

But then, when I print its length:

fmt.Printf("The last element len is '%s' ", len(messages[len(messages) - 1]))

I get:

The last element len is '%!s(int=506)'

I don't get it. Does anyone know what is happening?

I left the entire program here (it's pretty small). To pass input to this program just do:

printf "asti||"  | netcat localhost 7777

Here is the program itself:

package main


import (
    "fmt"
    "net"
    "os"
    "strings"


)


func main() {

    end_of_message_terminator := "||"
    beginning_of_next_message := ""
    request := make([]byte, 512)

    service_port := ":7777"
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service_port)
    checkError(err)
    listener, err := net.ListenTCP("tcp", tcpAddr)
    checkError(err)




    response_port := ":8887"
    tcpAddr_res, err := net.ResolveTCPAddr("tcp4", response_port)
    checkError(err)
    response_writer, err := net.ListenTCP("tcp", tcpAddr_res)




    for {
        conn, err := listener.Accept()

        if err != nil {

            continue

        }

        read_len, err := conn.Read(request)

        if read_len == 0 {
            continue
        }

        request_string := string(request)
        fmt.Printf("Request String %s\\END", request_string)

        messages := strings.Split(request_string, end_of_message_terminator)
        fmt.Printf("%q
", messages)

                messages[0] = beginning_of_next_message + messages[0]
        fmt.Printf("%s
", messages[0])
        fmt.Printf("The last element '%s'
", messages[1])
        fmt.Printf("The last element '%s'
", messages[len(messages) - 1])
        fmt.Printf("The last element len is '%s'
", len(messages[len(messages) - 1]))
        fmt.Printf("The last element is equal to empty string? %s
", messages[len(messages) - 1] == "")
        if messages[len(messages) - 1] != "" {
            beginning_of_next_message = messages[len(messages) - 1]
            messages[len(messages) - 1] = ""
            fmt.Printf("was here 00
")
        }

        if len(messages) == 1 {
            continue
        }



        conn.Close()

    }

}





func checkError(err error) {

    if err != nil {

        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
        os.Exit(1)

    }

}

The program is working with the entire request, not the portion filled in by Read. Change the line

    request_string := string(request)

to

    request_string := string(request[:read_len])

to fix this issue.

A better fix is to use bufio.Scanner to scan for message terminators.

func scanTerminator(data []byte, atEOF bool) (advance int, token []byte, err error) {
    if atEOF && len(data) == 0 {
       return 0, nil, nil
    }
    if i := bytes.Index(data, []byte("||")); i >= 0 {
        return i + 2, data[:i], nil
    }
    if atEOF {
        return len(data), data, nil
    }
    return 0, nil, nil
}

func main() {
    ...
    for {
        conn, err := listener.Accept()
        if err != nil {
            // handle error
        }

        s := bufio.NewScanner(conn)
        s.Split(scanTerminator)
        for s.Scan() {
           message := s.Text()
           // process message
        }
        if s.Err() != nil {
          // handle error
        }
    }
}