最最通俗易懂,并带小说情节的Go语言入门教程(连载二),没有之一,不接受反驳

简介: 最最通俗易懂,并带小说情节的Go语言入门教程(连载二),没有之一,不接受反驳

这篇是 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 )
}

王麻子端详半天,顿觉祖师爷智慧不浅。接着又向西方膜拜了半天。想我中原啥时能有此等良物。

相关文章
|
3天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
28 10
|
1天前
|
Go API 开发者
深入探讨:使用Go语言构建高性能RESTful API服务
在本文中,我们将探索Go语言在构建高效、可靠的RESTful API服务中的独特优势。通过实际案例分析,我们将展示Go如何通过其并发模型、简洁的语法和内置的http包,成为现代后端服务开发的有力工具。
|
3天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
21 10
|
3天前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
7天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
4天前
|
存储 Shell Go
Go语言结构体和元组全面解析
Go语言结构体和元组全面解析
|
9天前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
17 3
|
4月前
|
开发框架 安全 中间件
Go语言开发小技巧&易错点100例(十二)
Go语言开发小技巧&易错点100例(十二)
55 1
|
1月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
30天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID