登录
首页 >  Golang >  Go问答

无法通过远程过程调用在 Go 中使用 chan 吗?

来源:stackoverflow

时间:2024-02-06 23:27:20 254浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《无法通过远程过程调用在 Go 中使用 chan 吗?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

下面的代码,通过rpc获取message,为什么其done字段为nil?

chan无法通过rpc吗?

type Message struct {
    Text string
    Done chan bool
}

type (
    GetArgs struct {
        Key string
    }
    GetReply struct {
        Message  *Message
    }
)

// Client

func connect() *rpc.Client {
    client, err := rpc.Dial("tcp", ":1234")
    if err != nil {
        log.Fatal("dialing:", err)
    }
    return client
}

func get(key string) *Message {
    client := connect()
    args := GetArgs{key}
    reply := GetReply{}
    err := client.Call("KV.Get", &args, &reply)
    if err != nil {
        log.Fatal("error:", err)
    }
    client.Close()
    return reply.Message
}

// Server

type KV struct {
    mu       sync.Mutex
    messages map[string]*Message
}

func server() {
    kv := new(KV)
    kv.messages = map[string]*Message{}

    done := make(chan bool)
    kv.messages["Jan"] = &Message{Text: "hello", Done: done}

    rpcs := rpc.NewServer()
    rpcs.Register(kv)
    l, err := net.Listen("tcp", ":1234")
    if err != nil {
        log.Fatal("error:", err)
    }
    go func() {
        for {
            conn, err := l.Accept()
            if err == nil {
                go rpcs.ServeConn(conn)
            } else {
                break
            }
        }
        l.Close()
    }()
}

func (kv *KV) Get(args *GetArgs, reply *GetReply) error {
    kv.mu.Lock()
    defer kv.mu.Unlock()

    val, ok := kv.messages[args.Key]
    if ok {
        reply.Message = val
    }

    return nil
}

func main() {
    server()

    fmt.Printf("get() -> %v\n", get("Jan"))
    // Output:
    // get() -> &{hello }

}


正确答案


没有。 RPC参数只能是encoding/gob可序列化的参数,chans为not one of them

函数和通道不会在 gob 中发送。尝试在顶层对这样的值进行编码将会失败。 chan 或 func 类型的结构字段将被完全视为未导出字段并被忽略

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>