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

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

@[toc]

问题

在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错误【已解决】
731 1
|
Linux Go iOS开发
Go语言新手指南:正确使用GOPATH的步骤
Go语言新手指南:正确使用GOPATH的步骤
7055 0
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
3292 14
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
2805 1
|
Go 网络安全 开发工具
终极攻略!go get命令使用教程
终极攻略!go get命令使用教程
5474 0
|
JavaScript
Vue3弹性布局(Flex)
这是一个基于 Vue 的弹性布局组件库,提供了丰富的参数配置,如宽度、方向、换行等,支持自定义对齐方式和间隙设置。在线预览展示了不同布局效果,包括单选、按钮和滑动输入条等组件的使用示例。
809 0
Vue3弹性布局(Flex)
|
Go
Go语言中的默认参数和可选参数详解
【2月更文挑战第22天】
1783 2
解决go项目引进etcd/clientv3的一个报错grpc版本过高
解决go项目引进etcd/clientv3的一个报错"google.golang.org/grpc/naming: module google.golang.org/grpc@latest found (v1.53.0), but does not contain package google.golang.org/grpc/naming " 如果你的go版本高于1.17 请忽略这个处理办法,使用"go.etcd.io/etcd/client/v3" 因为etcd v3版本接口和最新的grpc兼容,所以不用再像网上历史文章那样去处理,直接替换etcd包地址即可。
3038 0
|
Unix 编译器 Go
|
编解码 监控 安全
JT1078和GB28181差别在哪里?
JT1078和GB28181分别是针对车载监控和公共安全监控设计的标准协议。JT1078专注于车载视频监控,适用于物流与交通场景,强调实时传输、编解码支持及无线环境下的数据安全性;而GB28181侧重于大规模公共安全监控,覆盖城市安防等领域,支持多协议交互与级联方案。两者在技术上有交集,需通过中间件实现互联互通,各有独特优势以满足不同需求。
911 8