2016-07-13 3 views
1

なぜ空の文字列が506バイトであるのか分かりません。空の文字列ですが、lenは何とか500バイトです

は、だから何が起こるかは、私はこのようにスクリーニングするための文字列を印刷しておくことである。

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) 

    } 

} 

答えて

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 
     } 
    } 
} 
関連する問題