Похоже, проблема, с которой вы столкнулись, заключается в том, что json.Unmarshal не обрабатывает завершение строки в байтовом массиве (для меня это на самом деле похоже на ошибку, если он ожидает байтовый массив, он должен знать, как с ним работать).Таким образом, когда вы выделяете 1024-байтовый буфер и считываете его из соединения, вы получаете несколько символов данных, нулевой байтовый терминатор и все остальное, что является мусором.И это смущает json.Unmarshall.Это фактически выдает ошибку об этом, и если вы не игнорируете свою обработку ошибок, вы увидите это:)
Объявление службы: если что-то возвращает ошибку, вы можете хотя бы распечатать ее.Вы будете благодарить себя позже, когда сломается дерьмо.
Есть несколько способов справиться с этим, но кажется, что стандартом является использование библиотеки bufio.Вот полный рабочий пример отправки JSON-записи по TCP-соединению и десериализации ее в структуру (да, этот код полностью игнорирует все ошибки)
основной пакет
import (
"bufio"
"encoding/json"
"fmt"
"net"
"time"
)
type DataTransferObject struct {
Name string `json:"name"`
Value string `json:"value"`
}
func server(l net.Listener) {
for {
c, _ := l.Accept()
data, _ := bufio.NewReader(c).ReadBytes(0)
fmt.Printf("read %v bytes from the server\n", len(data))
fmt.Println("data: ", string(data))
var obj DataTransferObject
err := json.Unmarshal(data, &obj)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Got object %+v\n", obj)
}
}
func main() {
l, _ := net.Listen("tcp", ":8080")
defer l.Close()
go server(l)
con, _ := net.Dial("tcp", "localhost:8080")
data := []byte(`{"name": "Mad Wombat", "value": "Awesome Go Marsupial"}`)
count, _ := con.Write(data)
fmt.Printf("written %v bytes to the server\n", count)
con.Close()
time.Sleep(time.Second) // wait for the server to do its thing
}