<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                Call方法會等待遠端調用完成,而Go方法異步的發送調用請求并使用返回的Call結構體類型的Done通道字段傳遞完成信號。 Call方法同步 Go方法異步 HTTP RPC http的服務端代碼實現如下: ~~~ package main import ( "errors" "fmt" "net/http" "net/rpc" ) type Args struct { A, B int } type Quotient struct { Quo, Rem int } type Arith int func (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil } func (t *Arith) Divide(args *Args, quo *Quotient) error { if args.B == 0 { return errors.New("divide by zero") } quo.Quo = args.A / args.B quo.Rem = args.A % args.B return nil } func main() { // 服務端會調用(用于HTTP服務) arith := new(Arith) /* Register在server注冊并公布rcvr的方法集中滿足如下要求的方法: - 方法是導出的 - 方法有兩個參數,都是導出類型或內建類型 - 方法的第二個參數是指針 - 方法只有一個error接口類型的返回值 如果rcvr不是一個導出類型的值,或者該類型沒有滿足要求的方法,Register會返回錯誤。Register也會使用log包將錯誤寫入日志。客戶端可以使用格式為"Type.Method"的字符串訪問這些方法,其中Type是rcvr的具體類型。 */ rpc.Register(arith) /* HandleHTTP函數注冊DefaultServer的RPC信息HTTP處理器對應到DefaultRPCPath,和DefaultServer的debug處理器對應到DefaultDebugPath。HandleHTTP函數會注冊到http.DefaultServeMux。之后,仍需要調用http.Serve(),一般會另開線程:"go http.Serve(l, nil)" */ rpc.HandleHTTP() /* ListenAndServe監聽srv.Addr指定的TCP地址,并且會調用Serve方法接收到的連接。如果srv.Addr為空字符串,會使用":http"。 ListenAndServe使用指定的監聽地址和處理器啟動一個HTTP服務端。處理器參數通常是nil,這表示采用包變量DefaultServeMux作為處理器。Handle和HandleFunc函數可以向DefaultServeMux添加處理器。 */ err := http.ListenAndServe(":1234", nil) if err != nil { fmt.Println(err.Error()) } } ~~~ 通過上面的例子可以看到,我們注冊了一個Arith的RPC服務,然后通過rpc.HandleHTTP函數把該服務注冊到了HTTP協議上,然后我們就可以利用http的方式來傳遞數據了。 請看下面的客戶端代碼: ~~~ package main import ( "fmt" "log" "net/rpc" ) type Args struct { A, B int } type Quotient struct { Quo, Rem int } func main() { // if len(os.Args) != 2 { // fmt.Println("Usage: ", os.Args[0], "server") // os.Exit(1) // } // serverAddress := os.Args[1] /* DialHTTP在指定的網絡和地址與在默認HTTP RPC路徑監聽的HTTP RPC服務端連接。 */ client, err := rpc.DialHTTP("tcp", "127.0.0.1"+":1234") if err != nil { /* Fatal等價于{log.Print(v...); os.Exit(1)} Print調用log.Output將生成的格式化字符串輸出到logger,參數用和fmt.Print相同的方法處理。 Output寫入輸出一次日志事件。參數s包含在Logger根據選項生成的前綴之后要打印的文本。如果s末尾沒有換行會添加換行符。calldepth用于恢復PC,出于一般性而提供,但目前在所有預定義的路徑上它的值都為2。 Exit讓當前程序以給出的狀態碼code退出。一般來說,狀態碼0表示成功,非0表示出錯。程序會立刻終止,defer的函數不會被執行。 */ log.Fatal("dialing:", err) } // Synchronous call args := Args{17, 8} var reply int /* Call方法會等待遠端調用完成,而Go方法異步的發送調用請求并使用返回的Call結構體類型的Done通道字段傳遞完成信號。 Call調用指定的方法,等待調用返回,將結果寫入reply,然后返回執行的錯誤狀態。 */ err = client.Call("Arith.Multiply", args, &reply) if err != nil { log.Fatal("arith error:", err) } fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply) var quot Quotient err = client.Call("Arith.Divide", args, &quot) if err != nil { log.Fatal("arith error:", err) } fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem) } ~~~ 我們把上面的服務端和客戶端的代碼分別編譯,然后先把服務端開啟,然后開啟客戶端,輸入代碼,就會輸出如下信息: ~~~ Arith: 17*8=136 Arith: 17/8=2 remainder 1 ~~~ 通過上面的調用可以看到參數和返回值是我們定義的struct類型,在服務端我們把它們當做調用函數的參數的類型,在客戶端作為client.Call的第2,3兩個參數的類型。客戶端最重要的就是這個Call函數,它有3個參數,第1個要調用的函數的名字,第2個是要傳遞的參數,第3個要返回的參數(注意是指針類型),通過上面的代碼例子我們可以發現,使用Go的RPC實現相當的簡單,方便。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看