zoukankan      html  css  js  c++  java
  • 初学Golang的笔记

    Note

    1. 一个module是一个go package的集合,该module用于发布的一个单位。

    2. 一般一个go repo仅仅包含一个module,含有一个go.mod文件

    3. 每个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具体在哪。

    1. 每import一个包路径,这个路径以及其所有子路径如果有其他包的话,都将不被包含。
      比如:引入包github.com/google/go-cmp,则go-cmp/里面的cmp/.,如果想要引入cmp的包那么就需要包含github.com/google/go-cmp/cmp这个包,所包含的包没有module前缀包含关系。

    2. 第一次开始创建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并使用

    1. 先自己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
    
    1. 在另外一个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/)

    1. testing包的测试文件可以通过go test命令来测试

    2. 你写的go 代码
      以 _test.go结尾的;
      函数名是Test***
      并且有 func(t *testing.T)为函数签名的function
      全部被视为test代码。

    3. 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
    
    斯是陋室惟汝德馨!欢迎来访!
  • 相关阅读:
    【转】内部Handler类引起内存泄露
    检测是否存在相机硬件代码
    asp.net 过滤器
    iis 中经典和集成模式对应webconfig节点
    事务
    C# Excel操作
    一步一步部署SSIS包图解教程
    js和.net操作Cookie遇到的问题
    File,FileInfo,Directory,DirectoryInfo
    C#文件Copy
  • 原文地址:https://www.cnblogs.com/yuanmh/p/14748259.html
Copyright © 2011-2022 走看看