The Tour of Go(一) 初始化Go开发环境

简介: 2012年Go语言第一个正式版本至今已经历时6年,因其优秀的性能,简洁的并发以及高效的编译等优势市场份额逐步增多,越来越多的工程实践开始选用Go语言作为基础编程语言,其生态社区也逐步发展成型,下文将从零开始构建一个Go Project。


2012年Go语言第一个正式版本至今已经历时6年,因其优秀的性能,简洁的并发以及高效的编译等优势市场份额逐步增多,越来越多的工程实践开始选用Go语言作为基础编程语言,其生态社区也逐步发展成型,下文将从零开始构建一个Go Project。

一、Go 开发环境配置

 以mac os为例,简单的配置一下Go开发环境。

Step1: 安装sdk

方式1:下载 go mac pkg文件进行软件包 安装

方式2:通过homebrew 管理软件包

 
homebrew于mac如rpm包于linux,即mac下的软件包管理程序。可以通过如下命令安装homebrew
 
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
 
使用homebrew管理go sdk:
  • brew install go 安装
  • brew uninstall go 卸载

Step2: 配置环境变量

个人一直使用 oh my zsh, 直接编辑用户目录下的.zshrc文件即可,bash用户可以直接修改~/.bashrc。
 
下图为个人的环境配置:
 
2179260a-99eb-4b3c-a83b-fdf40664fec6.png
 
其中/Users/yzq/Code/go是我个人的go workspace
 
理论上现在go环境已经ready了,执行source .zshrc;go version
 
eac7d456-8c8a-4296-a3c3-1f66420e65ce.png
 

Step3: IDE配置

永恒的信念:工欲善其事,必先利其器
 
目前主流的编辑器都支持了Go,比如vim,sublime,vscode,atom,如何选择完全看个人意愿了,我一直在用的是 Jetbrains的 IDEA Go插件(喜欢完备特性的可以使用同系GoLand),该插件官方的说法是cover了GoLand所有特性。
 
直接打开Preference->Plugins安装Go插件即可
 
945f6b37-0f7d-4d76-927b-d188de070d37.png
最终效果如下:
eff08850-8a5c-4833-bbaf-7fd6969ad350.png
 

二、Go 工程实践 

下文将重点讲述如何以工程化标准实践为要求建设Go工程

了解Go的workspace

 
workspace即工作空间,不同到编程语言乃至不同到IDE对于工作空间都有不同的设计理念(可以参考eclipse与IDEA工作空间的设计理念),以Java系IDE idea为例其工作空间叫Project,一个project会对应一套工程配置比如copyright,code format, and other config,比如多个项目可能使用不同的配置,那么这个时候就可以从工作空间纬度进行隔离。
 
而Go的设计很巧妙,其工作空间只有一个,下面引述官方doc的两段描述:
  • Go programmers typically keep all their Go code in a single  workspace.
  • A workspace contains many version control  repositories (managed by Git, for example).
 
A workspace is a directory hierarchy with three directories at its root:
  • src contains Go source files.
  • pkg contains package objects
  • bin contains executable commands.
 
下图是我个人的工作空间目录: ~/Code/go 已经在环境变量配置。
 
工作空间一级目录
 
04b8793f-722c-41df-b044-2f6fe84a856d.png
 
src目录, 源码仓库按照服务进行划分如
 
0d16813f-c610-42d1-bf07-024309babfe9.png
使用 go get xxx下载的源码会自动到该目录下
 
bin目录,可执行二进制文件
f5bd3199-7f98-4344-bca3-7efa209e39fe.png
 
pkg目录,package object, build产物
 
87b6fa8e-5779-42c8-ae53-d2d0e95ac915.png
 
最佳实践
在工作空间规划上应尽可能按照如上所示,尤其是源码目录尽可能按照项目归属版本管理系统比如github,gitlab划分。
 
这样做还有一个好处,当你多个代码仓库使用不同的账号授权时候可以按照目录进行配置,比如同时使用github与gitlab可以根据仓库目录进行gitconfig配置不同的User。
 

创建第一个Project

首先,我们按照Go推荐的做法完成了workspace的划分,然后开始一个git项目,以我测试的demo为例,假设叫cool.go。
 
53d4e926-ee68-4119-95d7-5a7eb9101d31.png
 
目录非常简单,ecs,stringutil是两个package,下面以ecs为例说明如何创建及使用一个package。
  • doc.go    Go package的doc,用来生成go package document,源码如下:
/*
 	ecs OpenApi demo,use aliyun ecs sdk manage ecs, this package will provide you function list as follows:

	DescribeInstances, query your account ecs.
	CreateInstance, create a ecs vm with specified params.
 */
package ecsproxy

 
使用  ``go doc `` 查看package document
c82cf4a3-d48c-498f-b112-99f20dcf2178.png
 
  • ecsproxy.go 核心代码,该demo中主要封装ecs sdk操作ecs OpenAPI,源码如下:
package ecsproxy

import (
	"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
	"fmt"
)

//common init client
func initClient() (*ecs.Client, error) {
	ecsClient, err := ecs.NewClientWithAccessKey(
		"cn-shanghai",
		"",
		"")
	if err != nil {
		panic(err)
	}
	return ecsClient, err
}

func describeInstance() {
	ecsClient, err := initClient()

	request := ecs.CreateDescribeInstancesRequest()
	request.PageSize = "10"

	response, err := ecsClient.DescribeInstances(request)
	if err != nil {
		panic(err)
	}

	fmt.Print(response.Instances)
}

func createInstance() string {
	ecsClient, err := initClient()
	request := ecs.CreateCreateInstanceRequest()
	request.InstanceType = "ecs.n1.tiny"
	request.KeyPairName = "demo"

	var disks *[]ecs.CreateInstanceDataDisk
	var disk1 ecs.CreateInstanceDataDisk
	disk1.Size = "20"
	disk1.DeleteWithInstance = "true"
	disk1.Category = "cloud"

	request.DataDisk = disks

	response, err :=
		ecsClient.CreateInstance(request)
	if err != nil {
		panic(err)
	}

	fmt.Print(response.InstanceId)
	return response.InstanceId
}

 
  • ecsproxy_test.go ecsproxy.go UT,源码如下:
package ecsproxy

import (
	"testing"
)

func TestDescribeInstance(t *testing.T) {
	describeInstance()
}
 
运行ut,结果如下:
 
56a4711e-7292-4a86-856a-93b5cbfb257a.png
 
上面就是一个简单的demo,通过调用aliyun ecs sdk实现ecs openapi操作,以上操作都是通过IDE图形界面进行构建运行,建议初学者可以先了解以下go原生的构建,打包,测试等。
 
了解更多可以下载官方demo,执行go get golang.org/x/tour/gotour
 

三、Go进阶 

以上简单描述了Go的开发环境配置,工作空间划分以及简单demo,后续会持续更新Go工程实践及优雅编程方面的实践,更多内容推荐阅读:
 
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
前端开发 JavaScript Linux
Sublime Text 3配置Go语言开发环境
【4月更文挑战第13天】本篇文章 Huazie 向大家介绍使用 Sublime Text 3搭建Go语言开发环境,并演示编译运行 Go语言代码
798 8
Sublime Text 3配置Go语言开发环境
|
11月前
|
Go
Go语言构造函数的力量:初始化和配置的艺术
Go语言构造函数的力量:初始化和配置的艺术
140 0
|
11月前
|
Go
Go语言初始化指南:结构体成员变量的正确方式
Go语言初始化指南:结构体成员变量的正确方式
183 0
|
2月前
|
JSON 测试技术 Go
零值在go语言和初始化数据
【7月更文挑战第10天】本文介绍在Go语言中如何初始化数据,未初始化的变量会有对应的零值:bool为`false`,int为`0`,byte和string为空,pointer、function、interface及channel为`nil`,slice和map也为`nil`。。本文档作为指南,帮助理解Go的数据结构和正确使用它们。
85 22
零值在go语言和初始化数据
|
20天前
|
设计模式 Java 数据库连接
|
1月前
|
存储 缓存 Java
涨姿势啦!Go语言中正则表达式初始化的最佳实践
在Go语言中,正则表达式是处理字符串的强大工具,但其编译过程可能消耗较多性能。本文探讨了正则表达式编译的性能影响因素,包括解析、状态机构建及优化等步骤,并通过示例展示了编译的时间成本。为了优化性能,推荐使用预编译策略,如在包级别初始化正则表达式对象或通过`init`函数进行错误处理。此外,简化正则表达式和分段处理也是有效手段。根据初始化的复杂程度和错误处理需求,开发者可以选择最适合的方法,以提升程序效率与可维护性。
36 0
涨姿势啦!Go语言中正则表达式初始化的最佳实践
|
2月前
|
自然语言处理 算法 Go
理解在go程序的初始化顺序和MVS
【7月更文挑战第9天】本文介绍Go程序初始化顺序:按导入顺序执行`init()`,先变量定义、常量、再执行`init()`,最后`main()`. 运行时使用`GOCOVERDIR`保存覆盖率数据。
82 1
理解在go程序的初始化顺序和MVS
|
2月前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
60 8
|
4月前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
52 1
Go语言学习11-数据初始化
|
4月前
|
Go 开发者 开发工具
Intellij IDEA 配置 Go 语言开发环境
【4月更文挑战第14天】本篇文章 Huazie 向大家介绍使用 Intellij IDEA 搭建 Go 语言开发环境,并演示编译运行Go语言代码
361 1
Intellij IDEA 配置 Go 语言开发环境