【从零单排Golang】第一话:Go开发环境搭建——Go环境变量、依赖与目录结构踩坑

原文摘自本人CSDN博客:【从零单排Golang】第一话:Go开发环境搭建------Go环境变量、依赖与目录结构踩坑

前言

当测试开发真不容易,入行第一年,就要在python、NodeJS、lua、C、Java等语言间无缝切换。为了快速响应需求,挺难抽出时间去深耕一门语言的特性(诶羡慕那些只搞Java的人= =)。在MTSC2019分享中也谈到,测试开发归属质量保障QA,作为一个中台角色,其终极任务保障研发效能,因此一大需求是打通产品研发运维的生产线。说到生产线就想到上云,说到上云就想到docker跟kube,说到跟容器的交互就想到了Golang。马蛋,又要学一门新语言了。

开这个坑,旨在展现以程序员的视角学习一门新语言的过程。希望大家看得欢乐。如果有启发,那就更棒啦!

安装与环境变量配置

家里的电脑是Windows,从官网即可下载Win的安装包。Go的版本为1.12。

下好后安装,安装完毕之后还需要设置环境变量(我的电脑------属性------高级系统设置)。GOROOT设置成Go的安装路径,还有一个关键的GOPATH,它表示你的工作目录,一般所有的Go项目,甭管第三方的还是你的,都统一放到这个目录下 (从这点可以看出,Go的控制欲还是很强的)。GOPATH的一般结构如下:

  • GOPATH
    • bin 可执行文件目录
    • src 源码目录

一般来讲我们可以在%GOPATH%\src下新开一个自己的文件夹存放我们以后的Go项目源码。而对于可执行文件,我们可以在环境变量PATH中增加%GOPATH%\bin%GOROOT%\bin保证在cmd里能直接运行。

配置VSCode环境

Golang用的IDE的话idea跟VSCode都ok,家里就用VSCode好了。这里直接在GOPATH下建立了一个mytest文件夹当作我们的测试项目,用VSCode打开,然后添加一个Go脚本main.go,内容就是我们见到最多的:

go 复制代码
package main

import "fmt"

func main() {
   fmt.Println("Hell World")
}

这个时候VSCode就会提示下一堆工具依赖了(linter、自动填充之类)。但是VSCode插件默认会从go source下载。由于众所周知的不可抗力一般下载不行,但有其它的解决方法:

  • 测一下github网速,实在不行请开启游戏加速器
  • 查看VSCode输出日志------看看哪些依赖安装失败。一般由于不可抗力,golang.org/x/tools/之类的google官方依赖会下不到。这个时候需要在%GOPATH%\src下建立golang.org/x目录,然后再从github上对应的仓库克隆github.com/golang/tools,然后go install。可以参考:VSCode + Golang配置
  • gocode-gomod等binary(exe),可以直接copy gocode改个名字就能用

万事开头难,一劳永逸,弄好这些就基本可以直接开搞了。VSCode还是很方便的,比如配合golint优化代码,代码规范的事情就完全不用担心了。

package import

再基于上面的mytest给个例子,文件结构如下:

  • GOPATH
    • src
      • mytest
        • main.go
        • hello
          • hello.go

在Golang里,单个目录下的直属go文件(也就是不包括子目录下的go文件),都必须只属于一个package 。Golang在import package时,本质也就是import一个目录啦,它会分别以%GOROOT%\src以及%GOPATH%\src为根目录开始寻找package。像fmt之类的标准库就在%GOROOT%\src中,而我们自己下的依赖就在%GOPATH%\src中。

根据上面的文件结构,我们可以在hello.go中填充内容:

go 复制代码
package hello

import (
    "fmt"
)

// Hello
func Hello(s string) {
    fmt.Printf("Hell%s World", s)
}

hello.go属于hello这个package,然后包含一个叫Hello的函数,这个函数具体干了什么相信大家都明白。然而里面其实有几个坑------Go约定public函数名称开头得大写 ,比如这个Hello(s string)写成hello的话,就成了private函数了。

main.go调用Hello函数的话,可以这样:

go 复制代码
package main

import (
    "mytest/hello"
)

func main() {
    var s string
    s = ""
    hello.Hello(s)
}

我们import的是mytest/hello,也就是相对于%GOPATH%\src的文件夹路径,就可以把package hello给引入。要调用的话,只需hello.Hello即可~

依赖管理

开发期我们常需要引入第三方库。python有virtualenv,Node有npm + package.json + node_modules,Java有Maven,那Golang里用什么解决方案呢?

四处寻觅了一下,目前有许多vender式的方案(类似node_modules),比如depglide,而现今主推的方案是1.11版本后的go mod指令。首先,需要设置环境变量GOMOD111MODULEon,然后增加一个代理,设置GOPROXYhttps://goproxy.io,这样就能便捷下载依赖了。

以安装后端框架gin为例,首先进入刚刚的mytest,直接go mod init,即可将之标为模块。值得注意的是,刚刚环境变量GOMOD111MODULE设为on后需要标识模块,里面的lib才能被import。

而后,copy gin的示例代码到main.go,直接go run main.go,依赖就会自动安装了。

总结

诶,对于开发者来说有一个舒服的开发环境是很重要的。后面再慢慢研究语言跟各种轮子的特性~

相关推荐
杨哥带你写代码1 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries2 小时前
读《show your work》的一点感悟
后端
A尘埃2 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23072 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code2 小时前
(Django)初步使用
后端·python·django
代码之光_19802 小时前
SpringBoot校园资料分享平台:设计与实现
java·spring boot·后端
编程老船长2 小时前
第26章 Java操作Mongodb实现数据持久化
数据库·后端·mongodb
IT果果日记3 小时前
DataX+Crontab实现多任务顺序定时同步
后端
姜学迁4 小时前
Rust-枚举
开发语言·后端·rust
爱学习的小健4 小时前
MQTT--Java整合EMQX
后端