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

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

上午写了很多,电脑死机了,一下都没有了。作为一个老司机,真是大意了。

上次写了一篇关于程序员怎么学习的文章,感兴趣的可以点开链接看看,《寻根学习法》,昨晚睡不着的时候想,也许更名成《溯源学习法》更好听呢。

之前分享了一篇关于学习方法的文章,本来想着如果有一定的计算机基础,告诉大家应该学什么,然后接着再分享一些利用寻根学习法的编程教程。但是一个读者的留言改变了我的想法。

我们都曾经有过被一堆概念吓坏的时候,我们都曾经有过抱怨那些可恶的概念制造者的时候,直到后来我们和这些概念成了朋友,然后大骂一句,装啥装,不就是XX吗。

这个读者的留言让我觉得,有没有一种可能,不用那些高级的面向对象(如果不懂请忽略)的称呼,写一篇通俗易懂的编程语言入门教程?

来了,就是这篇了。

生活中很多事情都有个约定俗成的东西,比如说我们需要走门进别人家,而不是窗户。

那么对于Go 家族(嗯,为了通俗易懂,我们称为Go 家族)来说,这个大门的名字是main,小门的名字也是main。

我们写了一些 Go 的代码,可以把它理解成Go 家族的一员。那么我们去他家串门的话,他家的大门在哪呢?

他家的大门就是文件顶部有个 package main 的文件。

进了大门还要找正门, 正门是啥呢,正门就是 main 函数。

下次我们去他家逛的时候就知道了,没有大门(文件顶部有 package main 字样的) 的咱不去。进了大门,没有正门的(main 函数) 的我也不去。

你可能会问我,啥是函数?是 x = y + 1 吗?

不是。这个函数就是一段有名字的代码。

比如:

func main() {
    fmt.Println("Hello, World!")
}

其中,func 是标记,英语function的简写, main就是名称, 后面跟了一对括号。

不用去理解,记住就行了。函数就长这样。长这样的就叫函数。

碰到有些初学者,比如我,非得去思考为啥长这样就叫函数?有没有人能和我说一下,连个讲道理的人都没有吗?

后来理解了,长这样就叫函数,长那样就叫变量。没啥好问的。人家爹妈给起的名字。

既然说到变量了,变量的英文是variable,所以在Go 语言里先用 var 来说明这是变量。

其实我连变量这个名字都不想提的,担心提了你又迷糊。

既然我们把用 Go 语言写的文件拟人化成人了,那么接下来我们邀请王麻子出场了。

王麻子家的名字叫王麻子.go, 理论上应该叫go麻子更合适一些。

咱们看看王麻子家长啥样。

我们可以在电脑上找找王麻子.go, 没有的话可以创建一个。

下面我们找找他家的大门,正门。聪明如你,肯定找到了。

package main
import "fmt"
func main() {
    fmt.Println("Hello, World!")
}

其他的不认识也没关系,谁还没有第一回呢。

虽然他家还空空荡荡的,没啥东西,不过我们一起认识一下他们家族的其他成员。

和所有生完孩子的人一样,如果把我们创建的成员当成孩子的话,我们都得给他们起个名字。

龙生九种,各有不同。Go 语言也是。

人有男女,Go 语言有逻辑、数字、字符串,还有其他。具体的见了再说,一下说出来估计你也记不住。

那么Go 语言怎么起名字呢?

var 张三 string = "张三"

这里的 string就是我们说的字符串类型。需要的话可以来这里看看具体有哪数据类型。

好多其他的编程语言就这样了,也不改了。但是Go 不一样,我们还可以再简单一点。

var 张三 = "张三"

你可能会说早这样不好吗?早告诉你这样也可以,问题是他换个马甲你就不认识了,对不?

你肯定说,还有比这简单的吗?那个 var 啥的看着别扭。

如果你认识 Go 语言的设计者,你肯定想着人肯定你说啥都能实现,对不?

大佬说:“我也看着嫌别扭, 你看这样如何?”

张三 := "张三"

“长了一堆小眼睛就可以了?” 你疑惑的问?

大佬说:“Of cource”。于是不屑的扭头走了,挥一挥衣袖,不带走你艳羡的眼神。

“那多个变量声明呢?一个个这样也麻烦。”

大佬:“你还真当自己是甲方爸爸了?自己看去。”

于是你小心翼翼的试了一下:

张三, 李四, 王麻子 := "张三", "李四", "王麻子"

“哇靠,真可以!” 你兴奋的喊着, “变量也就这么回事”。

大佬不屑的瞅了你一眼,甩来一段代码:

package main
var x, y int
var (  // 这种因式分解关键字的写法一般用于声明全局变量
    a int
    b bool
)
var c, d int = 1, 2
var e, f = 123, "hello"
//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"
func main(){
    g, h := 123, "hello"
    println(x, y, a, b, c, d, e, f, g, h)
}

你愁眉苦脸的看了看代码,又看了看大佬,不敢吱声了。

大佬缓缓的来了一句,“懂点就可以啦,可以去写点东西啦,没必要一下都搞懂嘛。鲁迅先生不是说了,读书不求甚解。”

你假装很懂的点了点头。

别看大佬了,看我。

我们再去看看其他的。

谁家没有一些瓶瓶罐罐,这些不变的东西,在代码里叫常量。

const LENGTH int = 10
 const WIDTH = 5  
 const (
    Unknown = 0
    Female = 1
    Male = 2
  )

基本上常量也就是这样表示的。

这时候你可能会想一下,有没有假如?

大佬虽然不懂你说的啥,兴匆匆的说,“有,有,不但有假如,还可以循环”。

大佬兴奋的给你演示他的发明, 你看“假如长这样”:

/* 判断条件 */
   if a == 100 {
   /* if 条件语句为 true 执行 */   
    fmt.Printf("a 的值为 100 , b 的值为 200\n" );
   }

"那看上去像菊花的是啥?” 你好奇的问?

大佬有点不悦,“这是注释。知道啥是注释吗?就是说明。写成这样就没人当他是代码了”。

“哦哦” 你似懂非懂的点了点头,“那这就是所谓的假如?”

大佬得意的说,“是啊,他还有其他花样,我给你变变”

/* 判断条件 */
   if a == 100 {
       /* if 条件语句为 true 执行 */
       if b == 200 {
          /* if 条件语句为 true 执行 */
          fmt.Printf("a 的值为 100 , b 的值为 200\n" );
       }
   }

“ 这叫嵌套”, 大佬得意的笑了笑,你正准备张口,大佬拿手一示意,别说话。

/* 判断布尔表达式 */
   if a < 20 {
       /* 如果条件为 true 则执行以下语句 */
       fmt.Printf("a 小于 20\n" );
   } else {
       /* 如果条件为 false 则执行以下语句 */
       fmt.Printf("a 不小于 20\n" );
   }

你抬头看了看大佬,大佬大概看出来你的意思了。他觉得你认为这不够酷。

大佬一下拿出两个法宝:

switch {
      case grade == "A" :
         fmt.Printf("优秀!\n" )    
      case grade == "B", grade == "C" :
         fmt.Printf("良好\n" )      
      case grade == "D" :
         fmt.Printf("及格\n" )      
      case grade == "F":
         fmt.Printf("不及格\n" )
                 fallthrough
      default:
         fmt.Printf("差\n" );
}

你疑惑的说“就知道装神弄鬼,其他的我在其他地方也见过,那个fallthrough 是啥?”

大佬得意的漏出了他的金牙,指了一下,神秘的说 “就因为这个,谷歌给我奖了颗金牙”。

“快说啊,我以前没见过”

“你见过啥?”

“我见过break”

“那都过时了,我这个和它正好相反。我设计的这个,执行完就结束了,不需要break。如果还需要继续执行就加个fallthrough。” “哦哦” ,你假装对大佬竖起大拇指,心里嘀咕着为啥其他人不这么搞,真是老糊涂了。

大佬神秘的说,给你再看个高级的:

var c1, c2, c3 chan int
   var i1, i2 int
   select {
      case i1 = <-c1:
         fmt.Printf("received ", i1, " from c1\n")
      case c2 <- i2:
         fmt.Printf("sent ", i2, " to c2\n")
      case i3, ok := (<-c3):  // same as: i3, ok := <-c3
         if ok {
            fmt.Printf("received ", i3, " from c3\n")
         } else {
            fmt.Printf("c3 is closed\n")
         }
      default:
         fmt.Printf("no communication\n")
   }

“这是?他们是亲戚?”

“嗯,算是吧。不过我改了一下他们的基因”

“有啥用?看着像四不像啊” 大佬得意的笑了笑,捋了捋白色的胡须,“天机不可泄露。知识送给有缘人,来日再见”

果然是神龙见首不见尾,大佬一下子不见了,你只能生硬的记住了这段代码。

由于思考的太过投入,你竟然在原地转起了圈圈。

当你突然意识到自己在转圈圈时,想起来如果我能让代码转圈圈就好了。

隐隐约约你听到大佬的声音:“那不就是循环吗”

你向四周看了看,什么也没有。

空山不见人,但闻人语响。

忽地眼前飘过来一段代码:

sum := 0
        for i := 0; i <= 10; i++ {
                sum += i
        }
        fmt.Println(sum)

你疑惑的看了看,似曾相识。

“i 是个变量,初始化成0, 假如 i 小于等于 10,就循环一次,每循环一下,i 加一” ,你默默的嘀咕着。

你恍惚觉得大佬有点惊讶的看着你。定了定神,原来只是幻觉。

“ i++, 这大佬一看就是懒人啊。i++ 是啥?难道是 i = i+ 1?”

“果然天资聪慧”,大佬赞许的点了点头。

你兴奋的说,“大佬,你神仙啊,你咋回来了”。大佬装模作样的说:“咳咳,嗯..., 算是吧”。

“这个叫 for 循环, i := 0 这个呢是初始化 i,然后呢加一个条件,i <= 10, 最后这个 i++ 和你想的一样,就是没执行一次循环加一”, 大佬继续说道。

大佬看你很轻松,就趁机拿出了for 的几种变化:

sum := 1
        for ; sum <= 10; {
                sum += sum
        }
        // 这样写也可以,更像 While 语句形式
        for sum <= 10{
                sum += sum
        }
        // 这样写也可以
        sum := 0
        for {
            sum++ // 无限循环下去
        }

“ 大佬, 你是不是工作量不饱和啊?” 你坏笑着问大佬。

大佬神情紧张的看了看四周,“嘘,年纪大了,不摸鱼熬不住,大厂也辛苦”。

“还有一种形式,真的有用,不过现在和你说了你也不懂”,大佬继续说道。

不过我可以给你三个法宝,大佬说着从怀里拿出了三样东西:

break 语句 经常用于中断当前 for 循环或跳出 switch 语句 continue 语句 跳过当前循环的剩余语句,然后继续进行下一轮循环。goto 语句 将控制转移到被标记的语句。

“拿好了,关键时候需要。不然你会吃亏的” ,大佬神神秘秘的说着。

你拍了拍灰尘,小心的收好了。

相关文章
|
4天前
|
存储 Go API
一个go语言编码的例子
【7月更文挑战第2天】本文介绍Go语言使用Unicode字符集和UTF-8编码。Go中,`unicode/utf8`包处理编码转换,如`EncodeRune`和`DecodeRune`。`golang.org/x/text`库支持更多编码转换,如GBK到UTF-8。编码规则覆盖7位至21位的不同长度码点。
70 1
一个go语言编码的例子
|
7天前
|
JSON 算法 测试技术
在go语言中调试程序
【6月更文挑战第29天】Go语言内置`testing`包支持单元测试、基准测试和模糊测试。`go test`命令可执行测试,如`-run`选择特定测试,`-bench`运行基准测试,`-fuzz`进行模糊测试。
17 2
在go语言中调试程序
|
5天前
|
安全 Go
Go语言的iota关键字有什么用途?
**Go语言中的`iota`是常量生成器,用于在`const`声明中创建递增的常量。`iota`在每个新的`const`块重置为0,然后逐行递增,简化了枚举类型或常量序列的定义。例如,定义星期枚举:** ```markdown ```go type Weekday int const ( Sunday Weekday = iota // 0 Monday // 1 Tuesday // 2 ... ) ``` 同样,`iota`可用于定义不同组的常量,如状态码和标志位,保持各自组内的递增,提高代码可读性。
|
1天前
|
监控 搜索推荐 Go
万字详解!在 Go 语言中操作 ElasticSearch
本文档通过示例代码详细介绍了如何在Go应用中使用`olivere/elastic`库,涵盖了从连接到Elasticsearch、管理索引到执行复杂查询的整个流程。
8 0
|
5天前
|
IDE Linux Go
记录一个go语言与IDE之间的问题
【7月更文挑战第1天】本文介绍在IDE中调试Go应用可能遇到的问题。当问题与IDE的自动完成有关,可以试着使用其他编辑器如Linux的vim是否无此问题。这可以验证表明IDE可能不完全兼容最新语言版本,建议使用无自动检测工具临时解决。
22 0
|
9天前
|
编译器 Go C++
必知的技术知识:go语言快速入门教程
必知的技术知识:go语言快速入门教程
|
10天前
|
编译器 Go 开发者
|
14天前
|
安全 测试技术 Go
Go语言在高并发场景下的应用
在当今互联网高速发展的时代,高并发已成为众多应用系统面临的核心问题。本文探讨了Go语言在高并发场景下的优势,并通过具体实例展示了其在实际应用中的效果和性能表现。
|
11天前
|
Go
go语言map、实现set
go语言map、实现set
14 0
|
11天前
|
Go
go语言数组与切片
go语言数组与切片
17 0