2017-04-18 14 views
1

構造体に値を設定しましたが、設定されていません。したがって、メソッドは並列ではなく呼び出されます。どのようにすることができますか?これはゴランです、忘れてしまいました。構造体内の値の設定に失敗する

"init"メソッドの代わりに "start"メソッドでコードを設定値に変更すると、機能します。 "init"メソッドの設定値は失敗します。私には非常に奇妙に見えます。ここで

package main 

import (
    "log" 
    "net/http" 
    "time" 
) 

type tServer struct { 
    ipAddress string 
    port  string 
    server http.Server 
} 

var server tServer 

func main() { 
    server.ipAddress = "0.0.0.0" 
    server.port = "12345" 
    server.init() 
    server.start() 
    time.Sleep(time.Second * 5) 
} 

func (srv tServer) init() { 
    srv.server.Addr = srv.ipAddress + ":" + srv.port 
    log.Println("srv.server.Addr=", srv.server.Addr) //////////////////// 
} 

func (srv tServer) start() { 
    log.Println("srv.server.Addr=", srv.server.Addr) //////////////////// 
    go srv.startServerRoutine() 
} 

func (srv tServer) startServerRoutine() { 
    log.Println("Server started at", srv.server.Addr) // 
    err := srv.server.ListenAndServe() 
    if err != nil { 
     log.Println("Server Error:", err) // 
     return 
    } 
} 

コンソールです:

2017/04/18 19:43:07 srv.server.Addr= 0.0.0.0:12345 
2017/04/18 19:43:07 srv.server.Addr= 
2017/04/18 19:43:07 Server started at 
2017/04/18 19:43:07 Server Error: listen tcp :80: bind: permission denied 
+3

あなたは方法は、あなたがその受信機のポインタhttps://tour.golang.orgにそのメソッドを定義する必要があり、その受信機の値を変更したい場合/メソッド/ 4 – mkopriva

+0

omg、ありがとう。私はそれを知っていたが、私はいつも何とかそれを忘れている。 XDはarrayの最初のインデックスであるゼロについて同じことです。私はいつも0からXD – Chelovek

答えて

5

これが原因メソッドのプロトタイプにある:そう

func (srv tServer) init() 
    // ^^^ copies values 

server.init() // updates its own copy of server, 
       // copy gets disposed after init() returns 

server.start() // uses its own copy of server 

あなたはポインタでsrvを渡す必要があります方法:

func (srv *tServer) init() 

その場合には、両方のinit()start()呼び出しはtServer構造の同じコピーで作業し、そのフィールドの値を共有します。

+0

の代わりに1から始まるループを書きたいと思っています。ありがとうございました。 – Chelovek

1

あなたがhttp.Serverのためにドキュメントを見ればあなたは空白の値が可能であることがわかります、と手段「:HTTP」:

type Server struct { 
     Addr  string  // TCP address to listen on, ":http" if empty 

あなたはinit()に直接srv.server.Addrを設定するが、これは正しい方法ではありませんhttp.Serverタイプを使用します。

はおそらく、あなたはこれを行うためのもの:

func (srv tServer) startServerRoutine() { 
    log.Println("Server started at", srv.ipAddress + ":" + srv.port) // 
    err := srv.server.ListenAndServe(srv.ipAddress + ":" + srv.port) 
    if err != nil { 
     log.Println("Server Error:", err) // 
     return 
    } 
} 
関連する問題