2014-06-10 3 views
3

UPDATEgolang не Rpc возвращения, когда структура имеет вложенную STRUCT

Двигаясь от кодирования до выработанного пространства JSon исправили проблему. Однако мне все равно хотелось бы знать, почему это не сработало с gob.

поэтому мой клиент код выглядит следующим образом

account := new(database.Account) 

err := client.Call("AccountDb.FindAccount", "username", account) 

if err != nil { 
    logger.FATAL.Print(err.Error()) 
    return 
} 

logger.INFO.Print(account) 

На стороне сервера AccountDb.FindAccount выглядит как этот

func (t *AccountDb) FindAccount(args *string, reply *Account) error { 

    reply.Username = "this is a test" 

    return nil 
} 

The структура для счета выглядит следующим образом

type Account struct { 
    Id   int 
    Username  string 
    Password  string 
    Email  string 
    Created  time.Time 
    LastLoggedIn time.Time 
    AccessLevel int 

    Banned struct { 
     reason string 
     expires time.Time 
    } 
} 

, если я попытаюсь для выполнения rpc запускаются запросы, и сервер выполняет процедуру. Однако программа затем зависает, и процедура не возвращается! Если, однако, я удаляю Banned anonymous struct из структуры Account, она отлично работает! Почему это? есть ли решение этой проблемы?

редактировать клиент и регистр сервера код выглядит следующим образом

Client

client, err = rpc.DialHTTP("tcp", "127.0.0.1:9001") 

if err != nil { 
    logger.FATAL.Panic(err.Error()) 
} 

Сервер

defer db.Close() 

account := new(database.AccountDb) 
account.Database = db 

rpc.Register(account) 
rpc.HandleHTTP() 
l, e := net.Listen("tcp", ":9001") 

if e != nil { 
    logger.FATAL.Fatal("listen error:", e) 
} 
http.Serve(l, nil) 
+1

Вы пытались создать дополнительную структуру для хранения информации о поле «Запрещено»? – nesv

+0

Я только что попробовал это сейчас, и у меня такая же проблема – zidsal

ответ

7

Очевидно, что кодер плевок не удается маршалу ответ RPC, так как Banned структуры не имеет экспортированных полей. Это playground example экспонаты ошибка:

encode error: gob: type struct { reason string; expires time.Time } 
has no exported fields 

Если вы экспортируете причину/истечения срока действия поля путем капитализации их, плевок туда-обратно работает нормально (см http://play.golang.org/p/YrYFsk6trQ).

Кодировщик JSON также требует, чтобы сериализованные поля экспортировались, но он не возвращает ошибку, если структура не имеет. Декодирование просто возвращает значения по умолчанию/ноль. Запустите http://play.golang.org/p/OBBkB4tPcZ и обратите внимание, что информация об Banned теряется в обратном направлении.

Если вам нужно, чтобы обнаружить эти виды ошибок в rpc пакете, есть два варианта:

  1. Edit rpc/debug.go, установите logDebug флага истину, и восстановить rpc пакет или
  2. Реализовать a ServerCodec, который обертывает существующую реализацию и регистрирует любые ошибки, возвращенные ReadRequestBody/WriteResponse.
+0

На этот вопрос существует проблема, https://code.google.com/p/go/issues/detail?id=8173 – Wessie

Смежные вопросы