2023-03-27
班门弄斧
00
请注意,本文编写于 623 天前,最后修改于 258 天前,其中某些信息可能已经过时。

目录

简介
项目
Go下载安装
go.mod
下载依赖
go-embed
undefined: XXX
结语

简介

某度百科:

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

在某个开源项目中,使用了Go作为后端服务开发语言,在此背景下第一次接触Golang,历经艰难险阻终于跑起来了后端服务。。。

项目

  • 项目名:van-nav
  • 项目简介:一个轻量导航站,汇总你的所有服务。全平台支持,单文件部署,有配套浏览器插件。
  • Github仓库:https://github.com/Mereithhh/van-nav

这是一个简洁的个人网站收藏夹,体积小,操作简单。

但是这个项目的代码显然没有经过认真整理,很多go文件零散的放在根目录,对于我这种没学过go的小白,直接无从下脚,但不管怎样,依照原有的开发经验(ps:最重要的还是咨询了作者),最终还是跑起来了。

Go下载安装

Go官网:The Go Programming Language

Go下载:All release

选在自己系统对应的版本,下载安装即可。

go.mod

go.mod文件用于管理go项目所需要的三方依赖,类似于Java项目常用的Maven的pom.xml

  • ChatGPT的回答:

go.mod 文件是 Go 1.11 之后引入的模块管理工具,它用于管理 Go 项目的依赖。它主要的作用有以下几个方面:

  1. 定义模块和模块版本:go.mod 文件记录了当前模块的名称、模块的版本号以及依赖的其他模块及其版本。
  2. 自动管理依赖:通过 go mod 命令可以方便地自动安装或更新依赖模块,同时也可以方便地移除不再需要的依赖模块。
  3. 保证构建的可重复性:在 go.mod 中指定了依赖版本号,可以保证在不同的环境中构建同一个项目时使用的依赖版本是一致的,保证了构建的可重复性。
  4. 支持私有仓库:可以在 go.mod 中指定私有仓库地址,实现对私有依赖的支持。

下载依赖

当一个已存在的项目,且项目中已经有go.mod文件,说明该项目已经启用了 Go Modules,这时候你就可以通过 go buildgo rungo test 等命令来构建、运行或测试你的代码。当然你应该先下载依赖:

go mod download

go mod download 是 Go 模块下载依赖的命令,它会下载 go.mod 文件中列出的依赖包及其依赖包的依赖包到本地缓存。通常在项目中第一次构建或添加新依赖包时,需要运行该命令。运行该命令可以保证依赖包的版本一致性,同时也能加快后续构建过程的速度。

  • 下载失败

如果 go mod download 命令执行失败,可能是因为网络问题或者是无法连接到默认的 Go 模块代理。此时,您可以尝试切换到其他可用的代理地址,例如 Goproxy.io、Aliyun、Golang 中国等。

可以通过设置环境变量 GOPROXY 来切换 Go 模块代理地址:

# Mac | Linux export GOPROXY=https://goproxy.io,direct # Windwos set GOPROXY=https://goproxy.io,direct

设置完成后,使用 go env GOPROXY 可以查看当前设置的代理地址。设置成功狗再试执行 go mod download 尝试下载依赖

go-embed

go:embed 是 Go 1.16 版本新增的一个指令,用于将文件或目录嵌入到 Go 程序的二进制文件中。可以方便地将静态文件(如 HTML、CSS、JS、图片等)打包到二进制文件中,无需额外的文件读取、解析等操作。

在本项目的main.go中有一行代码是:

go
//go:embed public

运行go run main.go时会报错,但看到这一行代码还很奇怪注释为什么会报错,其实并不是注释,语法就这样。。。

在 Go 1.16 版本中,添加了一个新的特性 //go:embed,它允许将文件或目录嵌入到 Go 二进制文件中。而为了确保该特性能够正确解析,需要在 //go:embed 前加上两个正斜杠 //。这样,Go 编译器就能够识别该注释,并执行对应的嵌入操作。

根据上面的说明,//go:embed public 这行代码是将public文件夹嵌入到Go程序中,但是download下来的代码并没有public文件夹,所以报错,在根目录创建public文件夹,并随便创建一个文件即可。

undefined: XXX

解决上述public的报错后,再次运行go run main.go,会报错:

# command-line-arguments .\main.go:52:25: undefined: updateCatelogDto .\main.go:67:44: undefined: Img .\main.go:128:22: undefined: updateToolDto .\main.go:146:25: undefined: Setting .\main.go:161:27: undefined: Token .\main.go:176:22: undefined: updateUserDto .\main.go:191:22: undefined: addCatelogDto .\main.go:215:19: undefined: addToolDto .\main.go:231:31: undefined: Tool .\main.go:248:34: undefined: Catelog .\main.go:248:34: too many errors

报错的这些都是实体类型,在根目录下的 types.go 文件中有定义,但是为什么会报错呢?刚开始以为是没有引用,所以尝试了各种引用方式,不行。

是在没办法,最后咨询了项目的作者,得到的答复是:运行 go run .

go
# go run . 数据库初始化成功。。。 应用启动成功,网址: http://localhost:6412

结语

虽然最终把项目跑起来了,也自己实现了几个功能,但也只是COPY而已,里学会Golang还差的远那。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:DingDangDog

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!