【Go语言】【11】GO语言的包和函数

简介:

还记得《【2】Sublime配置GO开发环境》的入门例子吗?

当然不记得了:) 

这篇文章距离上篇时间太久远了,遥远的我都快忘记了。还是把截图贴上吧

wKiom1VyXUySUg-RAAFLOm4XEBo344.jpg

该例子中的func main()表示这是一个名称叫main的方法,而package main表示这个方法在main包内,这两部分的内容就是本节要分享的知识。

这么简单?

是的,简单而不简约,呵呵,接着往下看!


        开发一个应用系统,考虑到代码的可读性,往往会把代码拆分到不同的包,再给包起一个好记的名字,这样一眼就能明白该包的用途,比如math包,这个就是Go语言本身的数学相关包,该包下面有求绝对值的源文件abs.go,还有求正弦的asin.go等......

        

1、那么什么是包?先看个例子:

        在E:\GO\workspace\pwm\src\util下创建一个common.go源文件,里面填写如下内容

        wKiom1WEubOCL159AADGA5swt3o258.jpg

        上面的common.go代码通过“package关键字”指定了它所属的包(common),接下来就是如何使用common.go中的IsEmpty()函数呢?

        在E:\GO\workspace\pwm\src下创建一个launcher.go源文件,里面填写如下内容

        wKioL1WEvLDA4dYlAACwCf6nSmo771.jpg

        上面的launcher.go通过“import关键字”把包(common)所在的路径(util)导入进来,然后再通过“包名.函数名(common.IsEmpty())”的方式实现调用。


备注:

到这里可能有人疑惑了,怎么会这样呢?平时调用时都是类似如下的方式写的:

import fmt

fmt.Println("import fmt,then use fmt's function to invoke")

解释:之所以能这样写的原因是“包名”和“路径”使用了相同的名称。这里为了把包表述清楚,故意把“包”和“包所在路径”使用了不同的名称。



2、函数

函数是由关键字func、函数名、参数列表、返回值、函数体构成,如下:

wKioL1WKqyGgw0L6AAB7K6GYY48275.jpg


(1)如果参数列表中类型相同的参数,如上例可以简写为:

func Add(a, b int)(ret int, err error){

    return a + b, nil

}

(2)当然调用该函数时,调用者不关心返回值,甚至不会使用返回变量名,所以上例可以再简写为:

func Add(a, b int)(int,  error){

    return a + b, nil

}

(3)初次使用GO的读者可能对“多返回值”感兴趣,以前使用别的语言时都是费劲心机地想返回多个值,没有想到GO帮着程序猿实现了 :)


3、函数的不定参数

不定参数并不是新兴事物,Java6已有该事物。所谓不定参数即不清楚参数个数具体是多少,以例子来说明:

func Join(a, b string) string {

return a + b

}

该函数实现两个入参字符串的连接,由于入参只有两个,所以调用者只需要Join("a", "b")即可。


请接着向下想,若需要把多个字符串连接起来呢?你可能想到是把入参变为字符串数组,如下:

func Join(a []string) string {

joinStr := ""


for _, element := range a {

joinStr += element

}


return joinStr

}

但这样又带来一个调用问题,即调用者必须先初始化一个数组或者切片再进行调用,如下:

s := []string{"a", "b", "c", "d", "e"}

fmt.Println(common.Join(s))


若想让调用者不构造数组或者切片,就像一般字符串一样对待入参,此时就涉及到“不定参数”的概念,如下:

func Join(a ...string) string {

joinStr := ""


for _, element := range a {

joinStr += element

}


return joinStr

}

与上面的写法仅在于入参采用“...string”,调用者就像对待一般字符串,如下:

fmt.Println(common.Join("a", "b", "c", "d", "e"))


这种不定参数看着比较优雅,同时也存在一个问题:若入参不全是同一种类型呢?比如入参中即有字符串也有整形,此时必须把不定参数放在最后,否则会报类似can only use ... as final argument in list错误

func Join(i int, a ...string) string {

fmt.Println("----------------", i)

joinStr := ""


for _, element := range a {

joinStr += element

}


return joinStr

}


4、结束语

我看过许式伟、云动力关于GO的书,还有无闻的视频,都谈及到闭包的问题,其实闭包概念很久之前JS就在使用,这里不想再谈闭包的问题,因为在程序的编写过程中我认为一切都是顺其自然的,写过一定代码之后自然就会考虑代码的优雅性,不留意间就使用到了闭包。





     本文转自qingkechina 51CTO博客,原文链接:http://blog.51cto.com/qingkechina/1665234,如需转载请自行联系原作者




相关文章
|
16天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
26 7
|
16天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
16天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
92 71
|
15天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
18天前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
88 62
|
20天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
10天前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
34 7
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
16天前
|
存储 Go
go语言中映射
go语言中映射
32 11
|
18天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
29 12
|
17天前
|
Go 索引
go语言使用索引遍历
go语言使用索引遍历
26 9
下一篇
DataWorks