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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qingkechina.blog.51cto.com/5552198/1665234

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

当然不记得了:) 

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

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

这么简单?

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

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

        

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

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

        

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

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

        

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



备注:

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

import fmt

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

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


2、函数

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

(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就在使用,这里不想再谈闭包的问题,因为在程序的编写过程中我认为一切都是顺其自然的,写过一定代码之后自然就会考虑代码的优雅性,不留意间就使用到了闭包。

本文出自 “青客” 博客,请务必保留此出处http://qingkechina.blog.51cto.com/5552198/1665234

时间: 2025-01-29 07:25:36

【Go语言】【11】GO语言的包和函数的相关文章

提供11种语言服务 携程将在欧洲多地设立呼叫中心

近日,携程CEO孙洁作为在线旅游业唯一代表,应邀出席第十二届中欧工商峰会,并在比利时掀起"旅游外交"旋风,揭示了携程的国际化未来. 与之相呼应的是,携程酒店部门很快就有了大动作,国际化布局加速驶入快车道.据悉,在服务端,不仅提供11种语言服务,而且将通过在欧洲多地设立的呼叫中心,提供海外本地化服务. 同时,在与Booking保持良好合作基础上,对于泰国.澳大利亚.日本等重点区域,携程酒店力推"九国计划",目前已取得初步成效,为中国游客带来更丰富的海外酒店产品和服务.

Java语言与C++语言的差异总结

Java的设计者曾说过,设计这门语言的灵感主要来自于C++. 世上先有C++,然后才有Java,整个Java语言的发展历史就是一部对C++的填坑史.所以在Java语言学习过程中,将其与C++语言对比是一件有意义的事情.通过这些对比,我们能够了解到Java语言相对于C++语言有哪些改进,能带给我们哪些进步,这样对于更加深入理解这两种语言是大有裨益的. 下面我总结一下Java语言与C++语言的各种差异. 1.Java用来操纵对象的引用可以先初始化再指向对象,而C++的引用必须在初始化时就指向对象.

C#语言与Java语言程序的比较

迈入二十一世纪以来,信息行业飞速壮大,其中在软件开发中Java语言与C#语言都独当一面,得到了逐步完善和广泛的应用,Java语言和C#语言都是一种面向对象的语言,但Java程序和C#程序还是有一定的区别. 下面分别是两种语言的程序的例子. 1.Java语言的基本程序: Import java.util.*; Package HelloJava{ Public class Message{ Public static void main(String [] args){ System.out.pr

Thinkphp搭建包括JS多语言的多语言项目实现方法_php实例

本文实例讲述了Thinkphp搭建包括JS多语言的多语言项目实现方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 项目需要开发英文版,于是需要搭建多语言项目. 项目使用Thinkphp框架,隐约记得Thinkphp有多语言设置,翻看了帮助手册,果然有,这就边实验边开始: 二.实现方法: Thinkphp采用app_begain来检测和切换语言包,语言包和项目相关,构架等都比较简单,具体的这里:http://www.thinkphp.cn/info/188.html 搭建好了,就可以使用

c语言函数-c语言学习求助大神:i函数问题

问题描述 c语言学习求助大神:i函数问题 编写函数,根据整型形参n的值,计算以下公式. T=1-1/(2*2)-1/(3*3)-1(4*4)---1(m*m) 例如,若m=5,T=0.536389 解决方案 double t = 1; for (int i =2; i <=m; i++) { t = t - 1 / (double)(m * m); } printf("%lf", t); 解决方案二: 这是个级数问题,当n值较大时,不能使用常规方法来求,这样精度不够,建议使用级数

《C语言程序设计:问题与求解方法》——2.3节C语言源程序的主要构成成分:函数定义

2.3 C语言源程序的主要构成成分:函数定义 我们通过例题2.1来探讨C语言源程序的主要构成成分(该程序的功能在学完本章后,读者自然应该能够懂得,现在不必为读不懂程序感到烦恼). [例题2.1]输入圆球的半径,求圆球的体积. C语言源程序如下: 0 #include<stdio.h> 1 int main(void) 2 { 3 float r ; 4 float v ; 5 6 printf("请输入圆球的半径,以米为单位\n"); 7 scanf("%f&qu

单元测试-C语言 应该怎么修改宏定义 在函数5执行之后,打印错误error 函数6也能执行

问题描述 C语言 应该怎么修改宏定义 在函数5执行之后,打印错误error 函数6也能执行 这是函数5static char * test_replace(){Link_t head;head = LinkTable_new();Link_t temp3 =Link_replace(head101""cpp101"");int number4;if(temp3 != NULL){number4 =2;}else{number4 =0;}if(number4 == 1

class-c语言定义一对一对的可变参数函数

问题描述 c语言定义一对一对的可变参数函数 fund(type_1 data_1 type_2 data_2 ...); 类似这样的函数怎样定义. 解决方案 http://www.cnblogs.com/MarvinGeng/archive/2012/07/19/2598923.html 解决方案二: 定义一个参数数组作为一个参数 解决方案三: typedef struct field_pad{ UINT1 type; UINT1 len; INT1 pad[62];}field_pad_t;

r语言-对一个向量的划分,求C语言或R语言实现

问题描述 对一个向量的划分,求C语言或R语言实现 1C 向量U={123456}利用R1属性划分为:U/R1={{123}{456}}利用R2属性划分为:U/R2={{12}{3456}}利用R3属性划分为:U/R3={{1234}{56}}最后得到划分的交集:U/R={{12}{3}{4}{56}}