Go 语言入门很简单:技巧和窍门 (Tips and Tricks)

简介: 本节将随着时间的推移而增长,但主要目标是分享一些有经验的开发人员在一段时间内发现的技巧。希望这些技巧能让新用户更快地提高工作效率。

140 个字符提示


  • leave your object oriented brain at home. Embrace the interface. @mikegehard


别想着面向对象了,拥抱接口吧。


  • Learn to do things the Go way, don’t try to force your language idioms into Go. @DrNic


学习用 Go 语言的方式做事,不要试图把你的语言习性强加给 Go。


  • It’s better to over do it with using interfaces than use too few of them. @evanphx


接口使用宜多不宜少。


  • Embrace the language: simplicity, concurrency, and composition. @francesc


拥抱这门语言:简单、并发和组合。



阅读他们在 golang.org 网站上的所有精彩文档。



多多使用 gofmt


  • read a lot of source code. @DrNic


阅读大量的源码。


  • Learn and become familiar with tools and utilities, or create your own! They are as vital to your success as knowing the language. @coreyprak


学习并熟悉工具和实用程序,或创建自己的工具和实用程序!它们对您的成功与了解语言一样重要

额外导入包的方法

还有其他几种导入包的方法。我们将在以下示例中使用 fmt 包:


  • import format "fmt" : 创建 fmt 的别名. 然后在所有使用 fmt 包内容的地方使用 format. 而不是 fmt.format.Println("Hello,World")
  • import . "fmt" : 多了个点号 . ,这种方式允许直接访问包的内容,无需在其前面加上 fmt
  • import _ "fmt" - 如果未使用 fmt ,则抑制与 fmt 相关的编译器警告,如果有则执行初始化函数。 fmt 的其余部分无法访问。

goimports

Goimports 是一种更新 Go 导入行、添加缺失行和删除未引用行的工具。


它的作用与 gofmt(插入式替换)相同,但除了代码格式之外,还修复了导入。

代码组织

Go 是一种非常简单的编程语言,但首先是开发人员最难的事情是如何组织代码。由于许多原因,轨道变得流行,并且脚手架是其中之一。它给出了新的开发人员清晰的指示和地方,以便将其代码和成语遵循。


在某种程度上,Go 通过为开发人员提供很棒的工具(如 go fmt)以及不会编译未使用的变量或未使用的导入语句的严格编译器来做同样的事情。

自定义构造函数

我经常听到的一个问题是我应该什么时候使用像 NewJob 这样的自定义构造函数。我的答案是,在大多数情况下你不需要。但是,每当您需要在初始化时间设置值并且您有某种默认值时,它都是构造函数的好候选者。在上面的示例中,添加构造函数会产生很多意义,因此我们可以设置默认记录器。

package main
import (
    "log"
    "os"
)
type Job struct {
    Command string
    *log.Logger
}
func NewJob(command string) *Job {
    return &Job{command, log.New(os.Stderr, "Job: ", log.Ldate)}
}
func main() {
    NewJob("demo").Print("starting now...")
}


集合

您可能希望找到一种方法来从集合中提取唯一值。用其他语言,您通常具有不允许重复的集数据结构。Go 没有内置的,但它不太难以实现(由于缺乏泛型,你需要为大多数类型做到这一点,这可能是麻烦的)。

// UniqStr returns a copy if the passed slice with only unique string results.
func UniqStr(col []string) []string {
    m := map[string]struct{}{}
    for _, v := range col {
        if _, ok := m[v]; !ok {
            m[v] = struct{}{}
        }
    }
    list := make([]string, len(m))
    i := 0
    for v := range m {
        list[i] = v
        i++
    }
    return list
}


我使用了一些有趣的技巧。首先,空结构体的映射:

m := map[string]struct{}{}

我们创建了一个映射,键是我们想要唯一的值,关联的值并不重要,所以它可以是任何东西。例如:

m := map[string]bool{}


然而,我选择了一个空结构,因为它会像布尔值一样快,但不会分配那么多内存。


第二个技巧可以看得更清楚一点:

if _, ok := m[v]; !ok {
  m[v] = struct{}{}
}

我们在这里所做的,只是检查映射 m 中是否有与键 v 关联的值,我们不关心值本身,但是如果我们知道我们没有值,那么我们添加一个。


一旦我们有了一个带有唯一键的映射,我们就可以将它们提取到一个新的字符串切片中并返回结果。


下面是这个函数的测试,如你所见,我使用了一个表测试,这是运行单元测试的惯用 Go 方式:

func TestUniqStr(t *testing.T) {
    data := []struct{ in, out []string }{
        {[]string{}, []string{}},
        {[]string{"", "", ""}, []string{""}},
        {[]string{"a", "a"}, []string{"a"}},
        {[]string{"a", "b", "a"}, []string{"a", "b"}},
        {[]string{"a", "b", "a", "b"}, []string{"a", "b"}},
        {[]string{"a", "b", "b", "a", "b"}, []string{"a", "b"}},
        {[]string{"a", "a", "b", "b", "a", "b"}, []string{"a", "b"}},
        {[]string{"a", "b", "c", "a", "b", "c"}, []string{"a", "b", "c"}},
    }
    for _, exp := range data {
        res := UniqStr(exp.in)
        if !reflect.DeepEqual(res, exp.out) {
            t.Fatalf("%q didn't match %q\n", res, exp.out)
        }
    }
}

依赖包管理

不幸的是,Go 没有自带依赖包管理系统。可能是因为它起源于 C 文化,包没有版本化,也没有解决显式的版本依赖问题。


挑战是,如果您的项目上有多个开发人员,则希望所有这些都在依赖项的同一版本上。您的依赖项也可能有自己的依赖性,并且您希望确保一切顺利。当您使用不同版本的相同依赖项时,它会产生甚至欺骗者。这通常是 CI 环境中的情况。


在我们的 CI 环境中,我们在运行测试套件之前将 GOPATH 设置为项目特定的文件夹,因此项目之间不会共享包。

善用错误

错误是 Go 中非常重要的模式,起初,新开发人员对返回值和错误的函数数量感到惊讶。


Go 没有您可能在其他编程语言中看到的异常概念。 Go 确实有一种叫做 panic 的东西,但正如它的名字所暗示的那样,它们真的很特别,不应该被拯救(也就是说,它们可以)。


首先,Go 的错误处理似乎繁琐和重复,但迅速成为我们思考方式的一部分。而不是创建泡起来且可能或可能不会处理或通过更高的异常,而是错误是响应的一部分,并且旨在由呼叫者处理。每当函数可能会生成错误时,其响应应包含错误参数。

相关文章
|
4天前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
51 20
|
2天前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
10天前
|
Go C语言
Go语言入门:分支结构
本文介绍了Go语言中的条件语句,包括`if...else`、`if...else if`和`switch`结构,并通过多个练习详细解释了它们的用法。`if...else`用于简单的条件判断;`if...else if`处理多条件分支;`switch`则适用于基于不同值的选择逻辑。特别地,文章还介绍了`fallthrough`关键字,用于优化重复代码。通过实例如判断年龄、奇偶数、公交乘车及成绩等级等,帮助读者更好地理解和应用这些结构。
34 14
|
24天前
|
存储 监控 算法
内网监控系统之 Go 语言布隆过滤器算法深度剖析
在数字化时代,内网监控系统对企业和组织的信息安全至关重要。布隆过滤器(Bloom Filter)作为一种高效的数据结构,能够快速判断元素是否存在于集合中,适用于内网监控中的恶意IP和违规域名筛选。本文介绍其原理、优势及Go语言实现,提升系统性能与响应速度,保障信息安全。
28 5
|
1月前
|
算法 安全 Go
Go语言中的加密和解密是如何实现的?
Go语言通过标准库中的`crypto`包提供丰富的加密和解密功能,包括对称加密(如AES)、非对称加密(如RSA、ECDSA)及散列函数(如SHA256)。`encoding/base64`包则用于Base64编码与解码。开发者可根据需求选择合适的算法和密钥,使用这些包进行加密操作。示例代码展示了如何使用`crypto/aes`包实现对称加密。加密和解密操作涉及敏感数据处理,需格外注意安全性。
46 14
|
1月前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
95 11
|
1月前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
|
9天前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
19 0
|
1月前
|
监控 安全 算法
深度剖析核心科技:Go 语言赋能局域网管理监控软件进阶之旅
在局域网管理监控中,跳表作为一种高效的数据结构,能显著提升流量索引和查询效率。基于Go语言的跳表实现,通过随机化索引层生成、插入和搜索功能,在高并发场景下展现卓越性能。跳表将查询时间复杂度优化至O(log n),助力实时监控异常流量,保障网络安全与稳定。示例代码展示了其在实际应用中的精妙之处。
44 9
|
2月前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
64 12

热门文章

最新文章