2013-07-17 6 views
2

Я закодировал простой сервер JSONRPC для тестирования возможностей Go, но я застрял, всегда получая пустой результат, без ошибок и правильного идентификатора. У меня есть следующий код: Перейти пакета главногоСервер JSONRPC возвращает пустой результат

import (
    "log" 
    "net" 
    "net/rpc" 
    "net/rpc/jsonrpc" 
) 

type Experiment int 

func (e *Experiment) Test(i *string, reply *string) error { 
    s := "Hello, " + *i 
    reply = &s 
    log.Println(s, reply) 
    return nil 
} 

func main() { 
    exp := new(Experiment) 
    server := rpc.NewServer() 
    server.Register(exp) 
    l, err := net.Listen("tcp", ":1234") 
    if err != nil { 
     log.Fatal("listen error:", err) 
    } 
    for { 
     conn, err := l.Accept() 
     if err != nil { 
      log.Fatal(err) 
     } 
     server.ServeCodec(jsonrpc.NewServerCodec(conn)) 
    } 
} 

Независимо от того, что я пытался, я всегда получил следующий ответ:

{"id":1,"result":"","error":null} 

Logging показывает, что все работает, как и должно быть в сервер.

2013/07/17 15:17:13 Hello, Paulo 0xc200090ac0 

Любые идеи о том, что происходит? Я использую последнюю стабильную версию Go, v1.1.1

Благодаря

ответ

5

Вашего ответа указателя типа в строку. Это нормально и даже требуется, поскольку второй аргумент используется для возврата ответа. Но тогда вы:

s := "Hello, " + *i 
reply = &s 

Что переводится:

  • Построить новую строку с новым значением.
  • Пусть ответ указывают на эту новую строку

Это позволяет строку, которая возвращается полностью незатронутыми. Пробег

*reply = s 
+0

Хм, это здорово! Я должен немного изучить указатели, так как это мой первый набег на языке с этим. Пока я не могу продвинуться, но позже. Спасибо, что нашли время, чтобы объяснить! – Paulo

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