空字符串,但len不知何故是500字节

时间:2016-07-13 17:09:38

标签: go

我无法弄清楚为什么空字符串长达506个字节。

所以会发生什么事情,我打印一个像这样的屏幕字符串:

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

我得到了:

The last element ''

但是,当我打印它的长度时:

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

我明白了:

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

我不明白。有谁知道发生了什么?

我把整个程序留在这里(它很小)。要将输入传递给此程序,请执行以下操作:

printf "asti||"  | netcat localhost 7777

这是程序本身:

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\n", messages)

                messages[0] = beginning_of_next_message + messages[0]
        fmt.Printf("%s\n", messages[0])
        fmt.Printf("The last element '%s'\n", messages[1])
        fmt.Printf("The last element '%s'\n", messages[len(messages) - 1])
        fmt.Printf("The last element len is '%s'\n", len(messages[len(messages) - 1]))
        fmt.Printf("The last element is equal to empty string? %s\n", 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\n")
        }

        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)

    }

}

1 个答案:

答案 0 :(得分:2)

该计划正在处理整个request,而不是Read填写的部分。改变行

    request_string := string(request)

    request_string := string(request[:read_len])

解决此问题。

更好的解决方法是使用bufio.Scanner扫描邮件终结器。

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