初学Golang的笔记
Note
一个module是一个go package的集合,该module用于发布的一个单位。
一般一个go repo仅仅包含一个module,含有一个go.mod文件
每个module路径不仅仅用于作为import的前缀,也用于帮助go command来查找下载这个module,比如我们import module golang.org/x/tools,go command 还需要从https://golang.org/x/tools 这个地方下载这个module。(详情见:https://golang.org/cmd/go/#hdr-Relative_import_paths)
go command在定位一个给定module的repo的时候,会通过https请求并且读取HTML内嵌的元数据,(详情见:https://golang.org/cmd/go/#hdr-Remote_import_paths),很多主句服务已经提供了go code的repo元数据信息,所以最佳设置你的module的方法通常是将你的module名和module repo URL路径相匹配,这样别人能够根据module名就可以找到你的repo具体在哪。
每import一个包路径,这个路径以及其所有子路径如果有其他包的话,都将不被包含。
比如:引入包github.com/google/go-cmp,则go-cmp/里面的cmp/.,如果想要引入cmp的包那么就需要包含github.com/google/go-cmp/cmp这个包,所包含的包没有module前缀包含关系。第一次开始创建module
$ mkdir hello # Alternatively, clone it if it already exists in version control.
$ cd hello
$ go mod init example.com/user/hello
go: creating new go.mod: module example.com/user/hello
$ cat go.mod
module example.com/user/hello
go 1.16
接着开始写go源文件,第一行是“包名”
package main
import "fmt"
func main() {
fmt.Println("Hello, world.")
}
这样就有了这个module的包以及内容,以及你声明的路径。
然后开始build 和install go tool:
go install example.com/user/hello
这个命令先编译成一个二进制文件,然后安装到你的PATH路径中存bin的文件目录中(这个具体存在哪可以通过GOPATH 和GOBIN这些go env环境变量来定)。如果GOBIN设置的话,那么就按照GOBIN设置的地方存放这个binary。
go env -w GOBIN=/somewhere/else/bin
如果取消设置环境变量可以通过 go env -w, 或者go env -u:
go env -u GOBIN
实例演示:自己编译一个module,然后本地import并使用
- 先自己code一个包,假如这个包在本地$HOME/hello/morestrings,然后里面有一个function
func ReverseRunes(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
注意:function首字母要大写,只有首字母大写的function才是exported.(https://golang.org/ref/spec#Exported_identifiers)
2. 然后build这个module
go build
- 在另外一个code里面去使用这个module
package main
import (
"fmt"
"example.com/user/hello/morestrings"
)
func main() {
fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
}
然后安装引用的包,最后执行。
go install example.com/user/hello
hello
Hello, Go!
实例演示:引用一个远程的module
现在假如我们想要引用一个远程的module,如果这个module是通过版本控制系统比如“Git, Mercurial”等控制,go tool会自动根据路径下载并使用这些repo,比如基于上个例子我们想使用一个远程库github.com/google/go-cmp/cmp 到你的项目里:
package main
import (
"fmt"
"example.com/user/hello/morestrings"
"github.com/google/go-cmp/cmp"
)
func main() {
fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
fmt.Println(cmp.Diff("Hello World", "Hello Go"))
}
现在你的项目依赖"github.com/google/go-cmp/cmp"这个包,那么你就需要下载这个包,同时你要在go.mod上面记录你想引用这个包的版本。
go mod tidy 命令可以自动下载你引用但是没有下载的包,同时去掉那些不在使用的。
go mod tidy
下载的包在指定的require版本其他所有版本中都是共享的,也因此go command把这些保存下载好的包的文件以及文件夹设置为只读的,防止用户更改下载下来的应用包。
如果想移除所有下载好的包,可以通过
go clean -modcache
实例演示:testing 包(详情见https://golang.org/cmd/go/#hdr-Test_packages testing 包doc:https://golang.org/pkg/testing/)
testing包的测试文件可以通过go test命令来测试
你写的go 代码
以 _test.go结尾的;
函数名是Test***
并且有 func(t *testing.T)为函数签名的function
全部被视为test代码。testfunction中如果调用t.Error or t.Fail,这时候就认为测试失败,现在看看下面测试ReverseRunes的例子。
注意:
文件名:$HOME/hello/morestrings/reverse_test.go
函数签名:func TestReverseRunes(t *testing.T)
package morestrings
import "testing"
func TestReverseRunes(t *testing.T) {
cases := []struct {
in, want string
}{
{"Hello, world", "dlrow ,olleH"},
{"Hello, 世界", "界世 ,olleH"},
{"", ""},
}
for _, c := range cases {
got := ReverseRunes(c.in)
if got != c.want {
t.Errorf("ReverseRunes(%q) == %q, want %q", c.in, got, c.want)
}
}
}
然后执行test代码:
go test
PASS
ok example.com/user/morestrings 0.165s
初学Golang的笔记的更多相关文章
- 初学c# -- 学习笔记(一)
初学c# -- 学习笔记(一) 学习C#了,参考许多资料,一步步学习.这一段学习ajax的工作原理,参照其他例子写了web版的群聊小程序,全部文件代码也就不到300行,很简单.使用时先输入用户名,点确 ...
- golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题
golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...
- golang学习笔记19 用Golang实现以太坊代币转账
golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...
- golang学习笔记18 用go语言编写移动端sdk和app开发gomobile
golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...
- golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍
golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...
- golang学习笔记16 beego orm 数据库操作
golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...
- golang学习笔记14 golang substring 截取字符串
golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...
- golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换
golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...
- golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题
golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...
随机推荐
- MIMO OFDM 常用信号检测算法
MIMO OFDM 系统检测算法 1. 前言 MIMO的空分复用技术可以使得系统在系统带宽和发射带宽不变的情况下容易地获得空间分集增益和信道的容量增益.OFDM技术采用多个正交的子载波并行传输数据,使 ...
- android分析之Thread类
线程与线程类要区分开来. 抽象来说,线程是CPU调度的最小单位,但是线程总要执行代码,这个代码就在线程类里说明(即Thread类).无论如何,Thread只是一个类,但其功能就是"启动一个线 ...
- 题解 CF746D 【Green and Black Tea】
# 题目分析这道题表面上看上去挺简单,其实仔细研究一下还是值得钻研的.我本人做这道题使用的任然是$ DFS01 $背包.不过呢,与往常背包不同的是,这次递归中需要加许多参数.就数据强度来看,栈问题不大 ...
- golang 矩阵乘法、行列式、求逆矩阵
package matrix import ( "math" "github.com/astaxie/beego" ) type Matrix4 struct ...
- Jmeter socket接口测试
一.Socket简介 什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把 TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程 ...
- MyBatis工程搭建&MyBatis实现Mapper配置查询
一.MyMyBatis工程搭建 新建Maven项目:mybatis-demo 准备数据源 1 # 删除mybatis_demo数据库 2 drop database if exists mybatis ...
- 论Redis分布式锁的正确使用姿势
前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...
- Clang Static Analyzer-使用手册-编写Checker框架
Clang Static Analyzer-使用手册-编写Checker Checker是这个工具的灵魂 有了checker才可以检查你的代码 相当于就是CSA通过checker定义的检查方法去检查代 ...
- [DP]城市交通
城市交通 Time Limit:1000MS--Memory Limit:65536K 题目描述 有n个城市,编号1~n,有些城市之间有路相连,有些则没有,有路则当然有一个距离.现在规定只能从编号小的 ...
- JS复制文本到粘贴板,前端H5移动端点击按钮复制文本
<span id="codeNum">FTYHDSDW</span> <span class=" code-btn" id=&qu ...