问题
在golang中同一个包中有两个文件,分别为main.go 和 server.go,main函数在main.go中,并且在main函数中引用了server.go中的一个结构体
运行时报错:
PS E:\myworkpace\goworkpace\go_im> go run .\main.go # command-line-arguments .\main.go:9:12: undefined: NewServer
原因
go run: 会先进行编译操作,而在此处的编译它只会以这个main.go为准,导致引用其他文件出现找不到的情况
go build:不一样,它会自动查找引用文件并打包
解决
方法一:
go run main.go a.go
方法二:
go run *.go
方法三:
go build
代码案例
main.go
package main import "fmt" func main() { fmt.Println("starting") server := NewServer("127.0.0.1", 8888) server.Start() }
server.go
package main import ( "fmt" "net" ) type Server struct { Ip string Port int } // 创建一个server的接口 func NewServer(ip string, port int) *Server { server := &Server{ Ip: ip, Port: port, } return server } func (s *Server) Handler(conn net.Conn) { // 当前连接的业务 fmt.Println("连接建立成功!") } // 启动服务器的接口 func (s *Server) Start() { // socket listen listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", s.Ip, s.Port)) if err != nil { fmt.Println("net.Listen err: ", err) return } // close listen socket defer listener.Close() for { // accpet conn, err := listener.Accept() if err != nil { fmt.Println("listener accept err: ", err) continue } // do handler go s.Handler(conn) } }
go.mod
module javapub.net/go_im go 1.18
项目初始化方式,
go mod init [module]