我在结构中设置了值,但没有设置.因此调用这些方法,而不是并行调用.怎么可能?这是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)
这是由于方法的原型:
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结构副本上工作,并将在其字段中共享值.
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |