这篇是 Go 语言通俗小说入门教程之二,前篇请戳
最最通俗易懂,并带小说情节的Go语言入门教程,没有之一,不接受反驳
上文讲到了 Go 家族的名字长啥样(文件名后面有.go
, Windows用户看不见的话可以在文件夹选项勾选一下 “显示扩展名”), 以及他们家的人怎么起名字,还有遇点事怎么处理,比如做个选择题,跑两圈啥的。
如果就这样下去其实也可以解决很多问题。但是随着王麻子.go
家的孩子越来越多,事情越来越多,王麻子说,这样下去不行,来了个人我都不知道怎么给你们介绍了。
这样吧,以后你们各自成立个小分队,这个小分队起个名字叫函数。
隔壁的张三听到了说,人家都是叫方法,你们偏叫函数。
王麻子说还有叫过程的,你管我们叫啥。这是祖师爷定下的,祖师爷的话要听。
张三说,那你们祖师爷咋规定的?
王麻子说,“听好了,从今往后,凡是自己想干点啥的,你们统一以func
开头,然后各自起个队名,需要啥资源(参数)的提前说,别到了后面找我要,没有的事。另外虽然我不期望你们能干点啥,但是如果你们能给我们点啥,要记得说,到时候我可以找你们要。”
张三说:“你最后说的就是返回值吧”
王麻子:“知道的就别说了,不知道的自己查资料去,现在我把这个要求给你们发一下,你们下去好好研究”
说着,拿出了一张纸,纸上写着如下文字:
func 函数名( 参数,参数... ) 返回类型 { // 干点好事吧 }
张三说:“你发这没有用,大家看不明白,你那有没有例子,我们参观一下?”
王麻子说“跟我来”,说着来到了最大家。
/* 函数返回两个数的最大值 */ //关键字 方法名 (参数,参数 参数类型) 返回值的数据类型 func max (num1, num2 int) int { /* 定义局部变量 */ var result int if (num1 > num2) { result = num1 } else { result = num2 } return result }
“看到了吗?” ,王麻子问到,“你先知道这么多就行了,人家有本事的,整的很复杂的,不是一句两句能和你说明白的。你先看看其他的,后面你们熟了自然就知道了。”
张三说:“还不一球样,故弄神虚罢了”。说完张三就走了。
王麻子看见张三走了,擦了一下头上的虚汗,对着祖师爷说:“祖师爷,我碰到了一个难题,如果需要返回多个数据怎么办,请祖师爷明示?”
王麻子突然觉得灵光一现,对着电脑一顿猛抠,
func swap(x, y string) (string, string) { return y, x }
抠完,立马把家里弄了一下,现在王麻子.go
家变这样了。
package main import "fmt" func swap(x, y string) (string, string) { return y, x } func main() { a, b := swap("Google", "Runoob") fmt.Println(a, b) }
保存后,一运行:
$ go run 王麻子.go => Runoob Google
王麻子一看可以,连忙往西方拜了拜,多谢祖师爷提点。
虽然到目前为止,王麻子甚是满意。但是看见家里到处乱跑的数字、字符串,王麻子就想有谁能把他们也组织到一起,这样我把他们放在某个地方,用的时候好拿,也不用一个个记名字。
王麻子想起自己上次拜会祖师爷立马就有了灵感,这次自然又想起祖师爷。
王麻子想着想着就睡着了,梦见了自己到了美国,看见了自由女神像。
王麻子看着自由女神像一直在想,天天举个火炬,累了也没地方放,别一下把纽约点着了。
突然王麻子想起来自己这次是专门来请教祖师爷的,所以就往前一直走。
经过了各种建筑,王麻子终于找到了祖师爷。
祖师爷有点破烂,王麻子有点心酸。
祖师爷说你来找我什么事?
王麻子赶紧整理了一下衣服说,家中小孩日渐增多,管理乏力,能否有个东西,把他们框起来?
祖师爷顺手甩过来了一对中括号 []
,如此这般和王麻子说了一番。
王麻子兴高采烈地回到了家中,睁眼一看,原来是场梦。
王麻子趁着还有记忆,赶紧按祖师爷说的做了起来:
// var 变量名 [数组长度] 变量类型
王麻子先依葫芦画瓢
var 大儿子一家 [10] int // 响应三胎号召,再生一胎 var 三胎 = [5] int {1, 2, 3, 4, 5} // 或者 三胎 := [5] int {1, 2, 3, 4, 5} // 或者用三个点表示数组大小,让祖师爷自己去想 三胎 := [...] int {1, 2, 3, 4, 5} // 或者将第1个 和 第4个 的初始化 三胎 := [5] int {1:2, 4:3}
王麻子看完,捋捋自己的小胡须得意的笑了笑。这时张三又从其他地方转了回来。
“你整的啥玩意啊?”
王麻子说:“这是洋玩意,祖师爷说了叫数组”
“你整这玩意你也分不开啊,到时一叫一大片,吵死了”,张三说道。
王麻子鄙夷的看了看张三,望着三胎说:“三胎[1]
”
三胎[1]
举个牌子走了过来,牌子上面写的是2。
张三看到了满脸嘲讽的说,“你这三胎可好了,明明让 1 来,偏偏举了个2”
王麻子气哄哄的说,人家那边数组是从 0
开始编号的,你好好记住吧。
张三还想吵,一看王麻子给气跑了。
这事,王麻子也不懂。但是祖师爷定的规矩不能乱。
日子过得飞快,王麻子日子也很舒心。和以前相比,现在的日子算天堂上的生活了。
除了三胎天天抱怨,有事没事让他跑一趟,本来也没啥他事,有时候就是提提他的名字,他也得来。
后来三胎学精了,也搞托梦那一套。
这不,王麻子又想起来三胎了,这次三胎派了个其他人来了。
王麻子说,“三胎了?”
那个人到 “在下就是,请老爷吩咐”
王麻子气的差点拿起棍子把这个人打死。
这个人不慌不忙的说,“老爷莫生气,我家老爷说了,经常没他什么事,他还拖家带口的跑来跑去,不值当。因此,祖师爷托梦说他有件法器,名为指针。拿着他就相当于我家老爷了。”
王麻子一听是祖师爷说的,往西方一作揖,拱手说到“既然如此,能和我说一下你怎么使唤?”
那人说到,“这很简单,当时祖师爷给了你 []
这对法器以后,其实还留了一手,以便他随时使唤。如今祖师爷觉得大家很懂规矩,便拿了这个法器给你们。请老爷看我头上有什么?”
王麻子定睛一看,来人头上顶了个 &
。
来人说“我还有一个兄弟名叫 *
。老爷请看:”
王麻子只看来人念着:&三胎
, 王麻子就看见了三胎
家的地址,很是神奇。
来人说,老爷,你也可以这样:
三胎 := [5] int {1, 2, 3, 4, 5} 指向三胎的指针 := &三胎 // “指向三胎的指针[1]” 的值为2 fmt.Printf("三胎变量的值: %d\n", 指向三胎的指针[1])
王麻子不禁露出了敬仰的表情。
来人继续说道,难道你不好奇那个菊花?
王麻子有点羞愧的说:“我们文人不好这口”
来人一听王麻子这样说,也顿觉羞愧,脸红着说:“虽是有点像,实则非常不同...”
王麻子有点不好意思的说:“此话怎讲?”
来人说:“这个菊花,老爷对不起,我不是故意的”,说着就要抽自己嘴巴。
王麻子此时已经缓过来了,大方的说,“不怪你,祖师爷这样设计,定有他的目的。你请继续”
来人继续说道:“虽然有时候是先有了孩子,后有了住址,不过有时也考虑先分住房,后有孩子。这时就需要用 *
了。”
看老爷有点困惑,来人四下看了看。
王麻子说:“此处无人,但说不妨”。
来人方从怀里拿出一个卷轴,卷轴上有如下字样:
package main import "fmt" func main() { var a int= 20 /* 声明实际变量 */ var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x\n", &a ) /* 指针变量的存储地址 */ fmt.Printf("ip 变量储存的指针地址: %x\n", ip ) /* 使用指针访问值 */ fmt.Printf("*ip 变量的值: %d\n", *ip ) }
王麻子端详半天,顿觉祖师爷智慧不浅。接着又向西方膜拜了半天。想我中原啥时能有此等良物。