2017-10-02 2 views
2

이 구조체는 소켓 메시지를받을 때 readJson과 structs가 데이터로 채워지고 모두 괜찮습니다. 그것은 몇 가지 함수를 거치지 만 일단 Send 함수를 거치면 이상한 방식으로 그것을 직렬화합니다. 결국에는 많은 숫자를 얻었고 문자열로 변환하면 데이터가 누락됩니다.구조체를 redigo Send 함수에 전달하면 데이터가 손실되고 데이터가 누락됩니다.

type Reply struct { 
    Topic string `redis:"topic" json:"topic"` 
    Ref string `redis:"ref" json:"ref"` 
    Payload struct { 
     Status string `redis:"status" json:"status"` 
     Response map[string]interface{} `redis:"response" json:"response"` 
    } `json:"payload"` 
} 

이 형식으로 메시지를 브로드 캐스트하고 싶습니다. 내가 수정 및 문제 데이터

func (rr *redisReceiver) run() error { 
    l := log.WithField("channel", Channel) 
    conn := rr.pool.Get() 
    defer conn.Close() 
    psc := redis.PubSubConn{Conn: conn} 
    psc.Subscribe(Channel) 
    go rr.connHandler() 
    for { 
    switch v := psc.Receive().(type) { 
    case redis.Message: 
     rr.broadcast(v.Data) 
    case redis.Subscription: 
     l.WithFields(logrus.Fields{ 
      "kind": v.Kind, 
      "count": v.Count, 
     }).Println("Redis Subscription Received") 
     log.Println("Redis Subscription Received") 
    case error: 
     return errors.New("Error while subscribed to Redis channel") 
    default: 
     l.WithField("v", v).Info("Unknown Redis receive during subscription") 
     log.Println("Unknown Redis receive during subscription") 
    } 
    } 
} 

합니까 Redigo 데이터 구조의 유형을 지원하지 어디서

이 무엇입니까?

이것은 내가 얻는 형식과 내가 가져야하는 형식입니다. Reply 유형 fmt.Print(v)을 사용하여 인코딩됩니다

Go Type     Conversion 
[]byte     Sent as is 
string     Sent as is 
int, int64    strconv.FormatInt(v) 
float64     strconv.FormatFloat(v, 'g', -1, 64) 
bool     true -> "1", false -> "0" 
nil      "" 
all other types   fmt.Print(v) 

: https://play.golang.org/p/TOzJuvewlP

답변

2

Redigo supports the following conversions to Redis bulk strings - 내가 다시 "손상"데이터 어디서 라인 (55)에

//Get 
"{{spr_reply sketchpad map[] 1} {ok map[success:Joined successfully]}}" 
//Supposed to get 
{event: "spr_reply", topic: "sketchpad", ref: "45", payload: {status: 
"ok", response: {}}} 

이다.

값을 JSON으로 인코딩하려는 것 같습니다. 그렇다면 응용 프로그램에서 인코딩을 수행하십시오. redis 필드 태그를 제거 할 수 있습니다.

writeToRedis(conn redis.Conn, data Reply) error { 
    p, err := json.Marshl(data) 
    if err != nil { 
     return errors.Wrap(err, "Unable to encode message to json") 
    } 
    if err := conn.Send("PUBLISH", Channel, p); err != nil { 
     return errors.Wrap(err, "Unable to publish message to Redis") 
    } 
    if err := conn.Flush(); err != nil { 
     return errors.Wrap(err, "Unable to flush published message to Redis") 
    } 
    return nil 
}