初次认识Golang
## 简介 某度百科: > Go(又称 Golang)是 Google 的 Robert Gries
渲染中...
## 简介 某度百科: > Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。 在某个开源项目中,使用了Go作为后端服务开发语言,在此背景下第一次接触Golang,历经艰难险阻终于跑起来了后端服务。。。 <!-- more --> ## 项目 - 项目名:**van-nav** - 项目简介:一个轻量导航站,汇总你的所有服务。全平台支持,单文件部署,有配套浏览器插件。 - Github仓库:https://github.com/Mereithhh/van-nav 这是一个简洁的个人网站收藏夹,体积小,操作简单。 但是这个项目的代码显然没有经过认真整理,很多go文件零散的放在根目录,对于我这种没学过go的小白,直接无从下脚,但不管怎样,依照原有的开发经验(`ps:最重要的还是咨询了作者`),最终还是跑起来了。 ## Go下载安装 Go官网:[The Go Programming Language](https://go.dev/) Go下载:[All release](https://go.dev/dl/) > 选在自己系统对应的版本,下载安装即可。 ## 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 build`、`go run`、`go 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还差的远那。
END
评论
登录后查看和发表评论
前往登录