• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Golang - 编写Go代码

武飞扬头像
u013433591
帮助1

Golang - 如何编写Go代码

今天学习下如何在Go模块中开发一个简单的Package包,并介绍Go相关工具,以及如何获取、构建、安装模块等使用方法。本文中的案例需要使用Go 1.13及以上版本。

代码组织

Go程序以package包的形式组织,package包是同一目录中所有源文件的集合。一个源文件中定义的函数、类型、变量、常量对同一包中的其他源文件可见

模块是一起发布的相关Go package包的集合。通常情况下,Go repository存储只包含一个模块,位于存储库的根目录。go.mod文件声明了模块引用路径 (模块中所有包的导入路径前缀)。模块包含其go.mod文件的目录中的包以及该目录下的子目录。

需要注意, 在构建代码之前,开发者不需要将代码发布到远程仓库,模块可以在本地定义,而不属于仓库。然而,组织代码是一个好习惯,就像有一天你会发布一样。每个模块的路径不仅作为其包的导入路径前缀,还指示go命令下载位置。导入路径是用于导入包的字符串。包的导入路径是其模块路径,它与模块中的子目录相连接。

第一个应用

  • 初始化项目

首先创建一个简单的应用程序,模块路径为 example/user/hello,并创建一个声明它的go.mod文件

$ cd hello
$ go mod init example/user/hello

学新通

go.mod 文件内容为

学新通

  • 应用代码

在根目录下,编写第一个应用程序 hello.go

package main

import "fmt"

func main() {
    fmt.Println("Hello, world.")
}
  • 编译运行

使用go 命令行工具编译应用程序

$ go install example/user/hello

该命令会在根目录下生成可执行的二进制文件(Windows系统会生成exe文件)。文件安装路径有GOPATH和GOBIN环境变量控制,如果设置了GOBIN,二进制文件将安装到该目录。如果设置了GOPATH,二进制文件将安装到GOPATH列表中第一个目录的bin子目录中。否则,二进制文件将安装到默认GOPATH($HOME/go或%USERPROFILE%\go)的bin子目录中。

# 使用go env命令查看环境变量设置
go env

学新通

如上图,GOPATH的目录是/Users/andy/go,因此应用程序安装在**/Users/andy/go/bin**目录中.

可以使用以下命令 设置GOBIN环境变量

$ go env -w GOBIN=/somewhere/else/bin

清空之前设置的环境变量可使用:

$ go env -u GOBIN

go install命令包含当前工作目录的模块上下文中。如果工作目录不在example/user/hello模块中,那么go安装可能会失败。为了方便起见,go命令接受相对于工作目录的路径,如果没有给出其他路径,则默认为当前工作目录中的包。因此,在我们的工作目录中,以下命令都是等效的:

# 方式一
$ go install example/user/hello
# 方式二
$ go install .
# 方式三
$ go install

运行该程序以确保其正常工作。为了更方便,我们将在PATH中添加安装目录,以使运行二进制文件更容易

$ export PATH=$PATH:$(dirname $(go list -f '{{.Target}}' .))
$ hello

学新通

导入本地模块

编写一个morestring包,并从hello程序中使用它。首先,为包创建名为$HOME/hello/morestrings的目录,然后在该目录中创建名为reverse.go的文件,其中包含以下内容:

// Package morestrings implements additional functions to manipulate UTF-8
// encoded strings, beyond what is provided in the standard "strings" package.
package morestrings

// ReverseRunes returns its argument string reversed rune-wise left to right.
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)
}

由于ReverseRunes函数以大写字母开头,所以它被导出,并且可以在导入我们的morestring包的其他包中使用。使用go build进行编译:

$ cd $HOME/hello/morestrings
$ go build

学新通

该命令不会生成任何输出文件。相反,它将编译的包保存在本地构建缓存中。在确认了morestring包的构建之后,就可以从hello程序中使用它。为此,请修改原始的$HOME/hello/hello.go以使用morestring包:

package main
import (
    "fmt"
    "example/user/hello/morestrings"
)

func main() {
    fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
}

重新编译、运行hello应用程序

# 编译应用
$ go install example/user/hello
# 运行应用
$ hello

学新通

导入远程模块

导入路径可以告知Go语言如何获取源代码,go工具使用此属性自动从远程存储库获取包。例如,要在程序中使用github.com/谷歌/go-cmp/cmp:

package main

import (
    "fmt"

    "example/user/hello/morestrings"
    "github.com/谷歌/go-cmp/cmp"
)
func main() {
    fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
    fmt.Println(cmp.Diff("Hello World", "Hello Go"))
}

源代码中已经依赖于外部模块,开发者需要手动下载该模块并将其版本记录在go.mod文件中。go mod tidy命令导入缺少的模块需求,并删除不再使用的模块的需求。

$ go mod tidy

学新通

模块依赖关系会自动下载到GOPATH环境变量指示的目录的pkg/mod子目录中。给定版本的模块的下载内容在需要该版本的所有其他模块之间共享,因此go命令将这些文件和目录标记为只读。要删除所有下载的模块,可以传递-modcache标志以清除:

$ go clean -modcache

单元测试

Go有一个由go test命令和测试包组成的轻量级测试框架。开发者通过创建一个名为_test.go的文件来编写测试,该文件包含名为TestXXX的函数和签名func(t*testing.t)。测试框架运行每个这样的函数;如果函数调用失败函数,例如t.Error或t.Fail,则认为测试失败。

  • 测试代码

在morestrings 包下创建 reverse_test.go 测试文件,单元测试代码如下

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)
        }
    }
}
学新通
  • 运行测试
$ go test

学新通

项目结构

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgekkhg
系列文章
更多 icon
同类精品
更多 icon
继续加载