【从零单排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,依赖就会自动安装了。

总结

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

相关推荐
村口张大爷6 分钟前
01 — MVC 与 DDD 的思维差异
java·后端
oldking呐呐8 分钟前
MySQL从建库到删库跑路 -- 3.库的操作
后端·mysql
空中海13 分钟前
第一篇:入门篇 — 认识 Spring Boot 与基础开发
java·spring boot·后端
栈位迁移中13 分钟前
二十一、Spring Framework 详细知识点文档
后端
马艳泽13 分钟前
Maven 编译时生成、纯静态文档、不能调试、零侵入、不用运行项目的api文档
后端
泰式大师14 分钟前
从“记忆”到“项目 Wiki”:我在 SkillLite 里实现了一套 Markdown-only LLM Wiki 自动维护机制
后端
ShineWinsu17 分钟前
对于Linux:进程间通信IPC(共享内存)的解析
linux·服务器·面试·笔试·进程·共享内存·ipc
渐儿19 分钟前
案例2:内存管理与性能优化
后端
一叶之政21 分钟前
C++ 系统学习日记・第 09 天|指针全解:定义 + 内存 + 空 / 野指针 + const 修饰 + 数组 + 函数
后端
风曦Kisaki21 分钟前
# Linux服务Day1:模板机制作、FTP与NTP服务配置全解析
后端