安装过程略过,网上搜一大把。

介绍

本文会在一个module中开发一个简单的Go package。

同时介绍go tool(也就是go命令行)。

以及如何fetch,build和install Go的modules,packages,commands。

代码组织

Go是按packages来组织代码的。一个package == 一个目录。

同一个package中的functions,types,variables,和constants是共享的。也就是包访问权限,java默认也是包访问权限。

packages是放在module中的,module是通过go.mod文件来定义的。典型的,一个repository只有一个go.mod,放在根目录。

可以使用go mod init name来创建这个文件。在go run后会生成go.sum文件,内容是go.mod的加密哈希。

repository也允许有多个module,module的packages是go.mod所在的目录,如果子目录也有go.mod,那么这个子目录的packages就属于子目录module。

第一个程序

假设module path是example.com/user/hello

  1. $ mkdir hello # Alternatively, clone it if it already exists in version control.
  2. $ cd hello
  3. $ go mod init example.com/user/hello
  4. go: creating new go.mod: module example.com/user/hello
  5. $ cat go.mod
  6. module example.com/user/hello
  7. go 1.14
  8. $

Go源文件的第一个语句必须是package name。程序入口必须是package main

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("Hello, world.")
  5. }

喜闻乐见Hello World。

现在可以build和install,

  1. $ go install example.com/user/hello
  2. $

这条命令会build然后生成可执行二进制文件(这是我比较喜欢Go的一个原因,直接生成可执行文件,省去了安装依赖的麻烦)。

buildinstall命令都可以生成可执行文件。不同点在于

  • go build 不能生成包文件, go install 可以生成包文件
  • go build 生成可执行文件在当前目录下, go install 生成可执行文件在bin目录下

install生成文件的bin目录是根据环境变量来的。按以下顺序检查

  • GOBIN
  • GOPATH

如果都没有设置,就会生成到默认GOPATH(Linux $HOME/go 或Windows %USERPROFILE%\go)。

示例的二进制文件会生成到$HOME/go/bin/hello(Windows的话就是%USERPROFILE%\go\bin\hello.exe)。

可以查看环境变量GOBIN和GOPATH的值

  1. go env

也可以设置GOBIN

  1. $ go env -w GOBIN=/somewhere/else/bin
  2. $

设置后可以重置

  1. $ go env -u GOBIN
  2. $

GOPATH需要到系统环境变量进行修改。

install等命令需要在源文件目录下执行,准确点说是“当前工作目录”。否则会报错。

在当前目录执行,以下等价

  1. $ go install example.com/user/hello
  1. $ go install .
  1. $ go install

验证下结果,为了方便,添加install目录到PATH

  1. # Windows users should consult https://github.com/golang/go/wiki/SettingGOPATH
  2. # for setting %PATH%.
  3. $ export PATH=$PATH:$(dirname $(go list -f '{{.Target}}' .))
  4. $ hello
  5. Hello, world.
  6. $

如果cd到了install的bin目录,也可以直接

  1. $ hello
  2. Hello, world.
  3. $

现阶段Go的很多库都是放在GitHub等代码托管网站上面的,使用Git进行提交

  1. $ git init
  2. Initialized empty Git repository in /home/user/hello/.git/
  3. $ git add go.mod hello.go
  4. $ git commit -m "initial commit"
  5. [master (root-commit) 0b4507d] initial commit
  6. 1 file changed, 7 insertion(+)
  7. create mode 100644 go.mod hello.go
  8. $

Go命令通过请求相应的HTTPS URL,并读取嵌入在HTML响应中的元数据<meta>标签,来定位包含给定module path的repository

  1. Bitbucket (Git, Mercurial)
  2. import "bitbucket.org/user/project"
  3. import "bitbucket.org/user/project/sub/directory"
  4. GitHub (Git)
  5. import "github.com/user/project"
  6. import "github.com/user/project/sub/directory"
  7. Launchpad (Bazaar)
  8. import "launchpad.net/project"
  9. import "launchpad.net/project/series"
  10. import "launchpad.net/project/series/sub/directory"
  11. import "launchpad.net/~user/project/branch"
  12. import "launchpad.net/~user/project/branch/sub/directory"
  13. IBM DevOps Services (Git)
  14. import "hub.jazz.net/git/user/project"
  15. import "hub.jazz.net/git/user/project/sub/directory"

很多托管网站已经为Go的repository提供了元数据,为了共享module,最简单的办法就是让module path匹配repository的URL。

从module import packages

先在名字为morestrings的package中创建一个reverse.go文件,实现字符串反转

  1. // Package morestrings implements additional functions to manipulate UTF-8
  2. // encoded strings, beyond what is provided in the standard "strings" package.
  3. package morestrings
  4. // ReverseRunes returns its argument string reversed rune-wise left to right.
  5. func ReverseRunes(s string) string {
  6. r := []rune(s)
  7. for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
  8. r[i], r[j] = r[j], r[i]
  9. }
  10. return string(r)
  11. }

由于ReverseRunes函数是大写的,所以是公有的,可以被其他packages import。

先build测试下编译成功

  1. $ cd $HOME/hello/morestrings
  2. $ go build
  3. $

因为只是在package中,不是在module根目录,go build不会生成文件,而是会把compile后的package保存到local build cache中。

接着在hello.go中import

  1. package main
  2. import (
  3. "fmt"
  4. "example.com/user/hello/morestrings"
  5. )
  6. func main() {
  7. fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
  8. }

然后install hello

  1. $ go install example.com/user/hello

验证,import成功,字符串反转

  1. $ hello
  2. Hello, Go!

从远程remore modules import packages

可以用import path通过版本控制系统来获取package源码,如Git或Mercurial。

示例,使用github.com/google/go-cmp/cmp

  1. package main
  2. import (
  3. "fmt"
  4. "example.com/user/hello/morestrings"
  5. "github.com/google/go-cmp/cmp"
  6. )
  7. func main() {
  8. fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
  9. fmt.Println(cmp.Diff("Hello World", "Hello Go"))
  10. }

当运行命令go install go build go run的时候,go命令会自动下载远程module,然后写到go.mod文件中

  1. $ go install example.com/user/hello
  2. go: finding module for package github.com/google/go-cmp/cmp
  3. go: downloading github.com/google/go-cmp v0.4.0
  4. go: found github.com/google/go-cmp/cmp in github.com/google/go-cmp v0.4.0
  5. $ hello
  6. Hello, Go!
  7. string(
  8. - "Hello World",
  9. + "Hello Go",
  10. )
  11. $ cat go.mod
  12. module example.com/user/hello
  13. go 1.14
  14. require github.com/google/go-cmp v0.4.0
  15. $

国内容易超时,可以使用代理走国内镜像

七牛云

  1. go env -w GO111MODULE=on
  2. go env -w GOPROXY=https://goproxy.cn,direct

阿里云

  1. go env -w GO111MODULE=on
  2. go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

module依赖会自动下载到GOPATH指定目录的pkg/mod子目录。

module指定版本的下载内容,是在所有其他require这个版本的modules中共享的,所以go命令会标记这些文件和目录为只读的。

可以使用命令删除所有下载的modules

  1. $ go clean -modcache
  2. $

测试

Go有个轻量的测试框架,go testtesting package

测试框架识别以_test.go结尾的文件,包含TestXXX命名的函数,函数签名func (t *testing.T)。如果函数调用失败如t.Errort.Fail,那么test就会失败。

示例,新建$HOME/hello/morestrings/reverse_test.go文件,添加morestrings package的测试代码

  1. package morestrings
  2. import "testing"
  3. func TestReverseRunes(t *testing.T) {
  4. cases := []struct {
  5. in, want string
  6. }{
  7. {"Hello, world", "dlrow ,olleH"},
  8. {"Hello, 世界", "界世 ,olleH"},
  9. {"", ""},
  10. }
  11. for _, c := range cases {
  12. got := ReverseRunes(c.in)
  13. if got != c.want {
  14. t.Errorf("ReverseRunes(%q) == %q, want %q", c.in, got, c.want)
  15. }
  16. }
  17. }

运行测试

  1. $ go test
  2. PASS
  3. ok example.com/user/morestrings 0.165s
  4. $

版权申明:本文为博主原创文章,转载请保留原文链接及作者。

Go测试开发(一) 怎么写Go代码的更多相关文章

  1. NX二次开发-NX+VS写代码设断点调试技巧

    在做NX二次开发的时候写完代码,编译可以通过,但是执行的时候却没有反应,或者得到的结果不对,说明肯定有地方传值出错了.我在查找代码错误的时候有几种方法:1.uc1601打印函数输入和输出的值看对不对. ...

  2. 技术调研,IDEA 插件怎么开发「脚手架、低代码可视化编排、接口生成测试」?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 不踩些坑,根本不是成熟的码农! 你觉得肯德基全家桶是什么?一家人一起吃的桶吗,就那么 ...

  3. ESP8266开发之旅 进阶篇⑤ 代码规范 —— 像写文章一样优美

    1.前言     之前,一直在跟大伙分享怎么去玩蓝牙模块,怎么去玩wifi模块,怎么去玩json,然后有很多小伙伴就留言各种问题或者说直接怼他的代码过来让我看,然后我就一脸懵逼(代码中到处各种abcd ...

  4. 为企业应用开发提速,写给企业IT部门的低代码开发基础知识

    简介:应用程序开发长期以来一直是IT部门和业务部门面临的问题. IT部门总是被新的应用程序需求弄得不堪重负.他们不可能完成业务部门想要完成的每一个项目. 同时,业务部门的用户厌倦了等待,并开始完全绕过 ...

  5. 笔试测试开发题三道(python)

    笔试遇到的三道测试开发题,虽然都不难,但关键还是思路吧!我想在开发东西的时候应该具备的就是思路,有了思路尝试去写,或查相关文档或代码,在此基础上需要不断调整最终达到需求.思路又是在不断练习中获得的. ...

  6. Android NDK开发(五)--C代码回调Java代码【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...

  7. 什么是测试开发工程师-google的解释

    什么是测试开发工程师-google的解释 “ 软件测试开发工程师[SET or Software Engineer in Test],和软件开发工程师一样是开发工程师,主要负责软件的可测试性.他们参与 ...

  8. 翻译一篇文章:It's Difficult to Grow a Test Developer(成为测试开发工程师的艰辛)

    翻译一篇文章:It's Difficult to Grow a Test Developer(成为测试开发工程师的艰辛)   以下文章是送给来poptest学习测试开发工程师的学员们,很多人想测试工程 ...

  9. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...

随机推荐

  1. grid网格布局使用

    定义 grid布局是指对网页进行划分成一个一个网格,然后根据自己的要求,可以任意组合. 以前写类似的功能,很麻烦,需要写很多的CSS去控制,有了grid就很方便了,可以随意进行组合. 跟flex有很多 ...

  2. 【NOIP2016】换教室 题解(期望DP)

    前言:状态贼鸡儿多,眼睛快瞎了. ----------------------- 题目链接 题目大意:给定$n(课程数),m(可换次数),v(教室数),e(无向边数)$,同时给定原定教室$c[i]$和 ...

  3. IDEA使用GsonFormat

    安装GsonFormat插件 因为下载了最新版的idea2020.1.3发现GsonFormat在Idea商店不见了,所以去jetbrains官网下载jar包来安装插件https://plugins. ...

  4. CSS漂亮盒子(下)

    4.多重背景 CSS支持一个元素设置多个背景图片. 每个背景属性有相应的多值语法,多个值由逗号分隔. .multi-bg-shorthand { width: 300px; height: 200px ...

  5. Jenkins持续集成(上)-Windows下安装Jenkins

    环境:Windows 2008 R2.Jenkins2.235.1: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成SLB.配置管理.Jenkins)> ...

  6. Windows10上安装Linux子系统(WSL2,Ubuntu),配合Windows Terminal使用

    Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具.实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销. WSL 说白了安装Li ...

  7. Socket 由浅入深,开发一个真正的通信应用

    在说socket之前.我们先了解下相关的网络知识: 端口  在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上, ...

  8. C#LeetCode刷题之#206-反转链表(Reverse Linked List)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3828 访问. 反转一个单链表. 输入: 1->2-> ...

  9. Window C盘 占满原因之一

    最近一段时间,突然C盘 莫名奇妙的满了 ,也没有中毒. 最后查找是因为安装了SQL Reporting  的原因 C:\Program Files\Microsoft SQL Server Repor ...

  10. 用mysqldump备份数据库

    格式:/usr/local/mysql/bin/mysqldump -hip -Pport -uuser -ppasswd --set-gtid-purged=off  --database aa & ...