Go 标准库 net/rpc 仅支持 Go 间通信、gob 编码、TCP 或手动封装 HTTP;服务端需导出方法及类型,参数返回值须为已导出类型且返回值为指针;注册名不可含空格,HTTP 路径固定为 /rpc;客户端须用 rpc.NewHTTPClient 或自构 http.Client,且确保 handler 注册早于 ListenAndServe。

Go 标准库的 net/rpc 能跑通最基础的 RPC,但默认只支持 Go 客户端和服务端互调,不跨语言;且必须用 gob 编码,HTTP 传输需手动包装。别指望它直接对接 Python 或 JavaScript 前端。
服务端必须导出首字母大写的函数和结构体
RPC 方法不是普通函数:必须是已导出(public)类型的方法,接收参数和返回值都得是已导出类型,且第二个参数必须是指针。
- 错误写法:
func (s *Server) add(a, b int) int—— 函数未导出、无指针返回参数 - 正确写法:
func (s *Server) Add(args *Args, reply *int) error -
Args必须是导出结构体:type Args struct { A, B int } - 服务注册前要先调用
rpc.RegisterName("Calc", &server),名字不能含空格或特殊字符
HTTP 传输需显式启用 rpc.ServeHTTP,且路径固定为 /rpc
标准 net/rpc 默认走 raw TCP,想用 HTTP 要自己套一层 http.ServeMux,而且它只响应 POST /rpc 请求,其他路径会 404。
- 启动时要用:
http.Handle("/rpc", rpc.DefaultServer),不是/api/rpc或/v1/rpc - 客户端必须用
rpc.NewHTTPClient()(Go 1.22+ 已弃用),或手动构造http.Client并设置Content-Type: application/gob -
浏览器直接访问
/rpc会报错 —— 因为它不支持 GET,也不返回 HTML,只认 POST + gob 编码请求
客户端调用失败常见原因:连接后立刻 Call 但服务未就绪
Go 的 rpc.DialHTTP 是阻塞连接,但不保证服务端 handler 已加载完成;尤其用 http.ListenAndServe 启动时,若 handler 注册在 ListenAndServe 之后,会导致首次调用超时或 connection refused。
立即学习“go语言免费学习笔记(深入)”;
- 务必确保
http.Handle("/rpc", rpc.DefaultServer)在http.ListenAndServe之前执行 - 客户端建议加简单重试:
for i := 0; i - 错误信息如
rpc: can't find service Calc.Add,说明注册名/方法名大小写不匹配,或没调用RegisterName
真正麻烦的是序列化耦合 —— gob 不兼容其他语言,HTTP 接口又没 REST 语义,连 curl 都没法手工测试。如果项目后续要开放给外部系统,从第一天就该考虑 gRPC 或 JSON-RPC。标准 net/rpc 只适合内部小工具或教学演示,别把它当生产 RPC 框架用。










