golang run时报undefined错误【已解决】

简介: golang run时报undefined错误【已解决】

问题

在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]

目录
相关文章
|
Go
golang run时报undefined错误【已解决】
golang run时报undefined错误【已解决】
2689 0
golang run时报undefined错误【已解决】
|
JavaScript 前端开发 测试技术
npm run dev启动报错:TypeError: Cannot read property 'upgrade' of undefined
npm run dev启动报错:TypeError: Cannot read property 'upgrade' of undefined
246 0
|
JavaScript
vue npm run build打包报错:Class extends value undefined is not a constructor or null
vue npm run build打包报错:Class extends value undefined is not a constructor or null
957 0
vue npm run build打包报错:Class extends value undefined is not a constructor or null
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
129 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
71 4
Golang语言文件操作快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
110 3
Golang语言之gRPC程序设计示例
|
3月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
100 4
|
3月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
52 3
|
3月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
70 4
Golang语言goroutine协程篇
|
3月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
71 3
Golang语言之Prometheus的日志模块使用案例