在结构中设置值失败

Che*_*vek 1 struct http go

我在结构中设置了值,但没有设置.因此调用这些方法,而不是并行调用.怎么可能?这是golang,忘了说.

如果我在"start"方法(而不是"init"方法)中将代码更改为设置值,则它可以正常工作; 但是"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
    }
}
Run Code Online (Sandbox Code Playgroud)

这是控制台:

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
Run Code Online (Sandbox Code Playgroud)

mya*_*aut 5

这是由于方法的原型:

func (srv tServer) init()
    // ^^^ copies values 
Run Code Online (Sandbox Code Playgroud)

所以:

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

server.start()  // uses its own copy of server
Run Code Online (Sandbox Code Playgroud)

您需要srv通过指针传递方法:

func (srv *tServer) init()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,两个init()start()调用将在同一个tServer结构副本上工作,并将在其字段中共享值.