当前位置: 首页 > news >正文

(done) Go 语言:三种多文件协作方式

go 语言多文件协作有三种方式:
1.同一文件夹下,同时编译运行多个 go 文件
2.使用 go.mod 配置项目结构,把不同文件分在不同包里
3.把一部分文件编译成动态库 .so 文件,然后一个 main 程序加载调用他们


task1: 同一文件夹下,同时编译运行多个 go 文件

main.go 内容如下:

package mainfunc main() {PrintHello() // 调用函数
}

print.go 内容如下:

package mainimport "fmt"// PrintHello 打印 "Hello, World!"
func PrintHello() {fmt.Println("Hello, World!")
}

运行方式如下(不编译)

go run main.go print.go

构建运行方式如下:

go build main.go print.go 
./main

task2: 使用 go.mod 配置项目结构,把不同文件分在不同包里

go.mod 像下面这样写

module type2_projectgo 1.15

位于 main 文件夹的 main.go

package mainimport "type2_project/printHello"func main() {printHello.PrintHello() // 调用函数
}

位于 printHello 文件夹的 print.go

package printHelloimport "fmt"// PrintHello 打印 "Hello, World!"
func PrintHello() {fmt.Println("Hello, World!")
}

运行方式:

go run main/main.go

也可以在其它文件夹下运行下面的命令来构建 main 可执行文件,但不能在当前目录构建,因为当前目录已经有个子目录名为 main,会造成名字冲突

go build main.go

task3: 把一部分文件编译成动态库 .so 文件,然后一个 main 程序加载调用他们

首先是 print.go 如下写

package mainimport "fmt"// PrintHello 打印 "Hello, World!"
func PrintHello() {fmt.Println("Hello, World!")
}

接着是 main.go 如下写

package mainimport ("plugin""log"
)func main() {// 加载插件p, err := plugin.Open("print.so")if err != nil {log.Fatal(err)}// 查找 PrintHello 函数symbol, err := p.Lookup("PrintHello")if err != nil {log.Fatal(err)}// 将 symbol 转换为函数类型并调用printHello := symbol.(func())printHello()
}

运行的方式如下:
1.把 print.go 编译成动态库

go build -buildmode=plugin print.go
go run main.go

这样就能正确运行了


相关文章:

  • word2vector训练代码详解
  • C++的6种构造函数
  • 分享国产32位单片机的电机控制方案
  • Ovis1.6-9B视觉大模型环境搭建推理
  • 实验报告2-前端框架和模板引擎实现视图
  • Kali Linux入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
  • 【并发】ThreadLocal 为什么会内存泄露
  • WAF,全称Web Application Firewall,好用WAF推荐
  • Ubuntu上安装Git:简单步骤指南
  • 字母象形:十分有趣的单词扩展逻辑
  • 联想电脑怎么开启vt_联想电脑开启vt虚拟化教程(附intel和amd主板开启方法)
  • 等保测评:企业数字安全的坚实盾牌
  • 【2024.9.29练习】R 格式
  • 在Spring项目中使用MD5对数据库加密
  • 【计算机网络】详解HTTP请求和响应格式常见请求方法Header报头响应报文状态码URL
  • [case10]使用RSQL实现端到端的动态查询
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Android单元测试 - 几个重要问题
  • co模块的前端实现
  • Create React App 使用
  • ES10 特性的完整指南
  • JAVA SE 6 GC调优笔记
  • Java精华积累:初学者都应该搞懂的问题
  • vuex 笔记整理
  • 初识 beanstalkd
  • 正则表达式
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • # Panda3d 碰撞检测系统介绍
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (2020)Java后端开发----(面试题和笔试题)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (笔记自用)LeetCode:快乐数
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (汇总)os模块以及shutil模块对文件的操作
  • (四)opengl函数加载和错误处理
  • (未解决)macOS matplotlib 中文是方框
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .Net FrameWork总结
  • .net 怎么循环得到数组里的值_关于js数组
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net下的富文本编辑器FCKeditor的配置方法
  • [ linux ] linux 命令英文全称及解释
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AIGC] CompletableFuture的重要方法有哪些?
  • [APUE]进程关系(下)
  • [AX]AX2012 SSRS报表Drill through action
  • [C++] Windows中字符串函数的种类
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!
  • [CSP-J 2022] 解密