Golang - 如何编写Go代码

news2024/11/19 3:29:55

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/google/go-cmp/cmp:

package main

import (
    "fmt"

    "example/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"))
}

源代码中已经依赖于外部模块,开发者需要手动下载该模块并将其版本记录在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

在这里插入图片描述

项目结构

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue11-事件修饰符

结论&#xff1a;前三最常用 1.prevent 此时点击链接&#xff0c;除了会提示我是一个超链接信息外&#xff0c;a标签还会默认后进行链接跳转&#xff0c;此时为了阻止默认跳转事件&#xff0c;可以加prevent属性实现。此时只有弹框提示是信息&#xff0c;链接不会进行跳转 2.st…

Aqua Data Studio 22.1.x Crack

Aqua Data Studio 数据库 IDE 的优势 使用单一数据库工具管理大量数据源的多项任务 轻松开发、执行和共享 SQL 语句 通过复制和粘贴在类似 Excel 的网格中查看、过滤和编辑查询结果 创建可视化和仪表板以通过拖放来分析数据 比较架构、数据、查询结果、文件和文件夹 将数据库逆…

流量录制工具怎么选?看完这篇文章就懂了

流量录制&#xff1a;在不影响用户正常使用的前提下&#xff0c;获取线上用户的真实请求和服务响应结果&#xff0c;将其保存或者转发到目标应用。 采用不同的流量录制手段&#xff0c;可以采集不同传输阶段的流量。 01、流量复制方式 1、基于应用层的复制&#xff1a; 优点…

Linux串口调试助手

前言 基于网上资料对相关概念做整理汇总&#xff0c;部分内容引用自文后文章。 在linux下使用串口终端有两个选择&#xff1a; 基于命令行的minicom图形界面的putty&#xff08;xshell没有linux版本&#xff09;1 概述 1.1 Linux的串口设备 Linux下的串口和windows不同&…

移动web媒体查询

移动web媒体查询媒体查询媒体查询使用场景-1媒体查询使用场景-2媒体查询使用场景-3Bootstrap栅格系统row 类列偏移列嵌套移动web阶段重点知识媒体查询 使用媒体查询做响应式页面,为Bootstrap 做铺垫。 body {background-color: gray; }/* 大于等于768px 为粉色 */ media (min…

注意力提示

人类的注意力是有限的、有价值和稀缺的资源。 受试者使用非自主性和自主性提示有选择性地引导注意力。前者基于突出性&#xff0c;后者则依赖于意识。 注意力机制与全连接层或者汇聚层的区别源于增加的自主提示。 由于包含了自主性提示&#xff0c;注意力机制与全连接的层或…

MiG Calendar 6.9.3 for Java Crack

将日历功能添加到您的 Java 应用程序。 使用 MiG Calendar&#xff0c;您可以毫不费力地将任何类型的基于时间的可视化添加到您的应用程序中。您可以创建任何东西&#xff0c;从完整的日历应用程序&#xff08;如 Outlook 或 Apple 的 iCal&#xff09;到电视节目表或航班信息应…

居家办公 01 - 组网

# 第一步 - 安装虚拟机 vmbox安装&#xff1a;https://www.virtualbox.org/wiki/Downloads # 第二步 - 修改配置 1. 配置虚拟机网络 网卡1&#xff1a;Host-Only&#xff0c;仅主机与虚拟机网络互通 网卡2&#xff1a;NAT&#xff0c;虚拟机访问互联网 2. 配置虚拟机网络 v…

Lazada、速卖通、沃尔玛、eBay等跨境电商平台怎么做好测评自养号?

现在亚马逊平台不仅会将产品和店铺进行排名&#xff0c;还会将进listing行排名&#xff0c;不同的排名有不同的影响因素&#xff0c;接下来跟随大家一起去了解清楚亚马逊影响listing排名的因素是什么&#xff1f; 1、卖家权重 亚马逊卖家权重与亚马逊控制的卖家指标相关&…

大数据技术架构(组件)9——Hive:数学函数

1.4.2、数学函数注意&#xff1a;当传入值为NULL的时候&#xff0c;返回值大多数也是NULL1.4.2.1、abs作用&#xff1a;返回绝对值select abs(-1),abs(1);1.4.2.2、acos-->从Hive0.13.0作用&#xff1a;如果 -1<a<1 或 NULL&#xff0c;则返回 a 的反余弦值。select a…

[MySQL]-主从同步实战-系统OOM

[MySQL]-主从同步实战-系统OOM 森格 | 2023年1月 本文主要描述了在主从同步过程中&#xff0c;主库非人为重启导致的主从瞬间中断情况的排查及解决。 文章目录[MySQL]-主从同步实战-系统OOM一、问题发现1.1 背景1.2 问题发现二、问题分析2.1 MySQL日志2.2 系统日志三、问题解决…

DocuWare 文档管理软件在金融行业成功案例分享

DocuWare 文档管理软件在金融行业成功案例分享 公司&#xff1a;Advantage Credit, Inc. 国家&#xff1a;美国 行业&#xff1a;金融 部门&#xff1a;财务部门 、人力资源部门 、质量合规管理部门 部署方式&#xff1a;云 成效&#xff1a;信用报告业务从基于办公室的业务模…

RobotStudio教程:ABB机器人拆垛与码垛应用示教编程与虚拟仿真

目录 任务描述 机器人拆垛与码垛工作站创建 机器人拆垛与码垛工作流程分析 机器人位置偏移函数介绍 机器人拆垛与码垛应用示教编程 机器人拆垛与码垛虚拟仿真 任务描述 在RobotStudio软件中创建ABB机器人拆垛与码垛工作站&#xff0c;并示教机器人拆垛与码垛程序&#x…

mysql与redis数据一致性问题相关面试题

1、mysql 与 redis 如何保证数据一致性问题 1. 更新 mysql 数据&#xff0c;在手动清除 Redis 缓存 &#xff0c;在重新查询最新的数据同步到Redis 中 伪代码&#xff1a; 判断如果 redis 是为空的 则读取 mysql 同步到 redis 中 setRedis(key&#xff0c;mysql 数据) 2.更新…

法律常识(二)婚姻法解读

目录 参考 &#xff3b;重婚&#xff3d;禁止有配偶者与他人同居 &#xff3b;有配偶者与他人同居&#xff3d; &#xff3b;家庭暴力&#xff3d; 实践中对于借婚姻索取财物一般如何处理&#xff1f; 索要“彩礼”是否是婚姻法所禁止的行为&#xff1f; 实践中因夫妻一方…

【GD32F427开发板试用】多路ADC规则组同时采样 DMA进行传输数据 顺带开启FPU浮点运算

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Hello_eQN7e7 前言 开启浮点运算 加快浮点类型数据计算使用GD32F427V-START开发板的ADC1采样四路电路使用DMA1进行数据实时搬运至内存读出数据…

Spark RDD 转换算子

文章目录Spark RDD 转换算子一、Value 类型1、map (映射)2、 mapPartitions (map优化缓冲流)(1&#xff09;函数说明(2) 代码示例(2&#xff09;小案例获取每个分区的最大值3、 map 和 mapParitions 的区别4、 mapParitionsWithIndex(1) 小案例只获取第二个分区的最大值(2&…

开工干活累了,晚上不得找个陪玩打打游戏?我教你们用python找个人美声甜的

序言 好兄弟们&#xff0c;陪玩大家多少都知道亿点吧&#xff01; 漂亮妹妹超级多&#xff0c;长得又好看&#xff0c;还会萝莉音御姐音&#xff0c;滋溜~ 就是说&#xff0c;今天来带咱们来爬爬陪玩的数据&#xff0c;一起看看行情咋样~ 工欲善其事&#xff0c;必先利其器…

使用CyberController来将旧手机改造成电脑外挂

这个是我在哔哩哔哩中发现的感觉比较实用在这里发表一下使用过程中的问题和见解 原作者视频旧手机改电脑外挂-效率或将“提升300%&#xff1f;”_哔哩哔哩_bilibili 参考视频旧手机改电脑外挂&#xff0c;简陋的参考视频_手机游戏热门视频 (bilibili.com) 感谢这两位博主 这个是…

Java十大经典排序算法

目录1. 插入类排序1.1 直接插入排序1.2 希尔排序2. 选择类排序2.1 直接选择排序2.2 堆排序3. 交换类排序3.1 冒泡排序3.2 快速排序&#xff08;递归&#xff09;3.2.1 快排的优化3.3 快速排序&#xff08;非递归——栈&#xff09;4. 归并类排序4.1 二路归并排序&#xff08;递…