我是如何 3 小时上手 Golang 的

本文介绍了Go语言的基础知识,包括指针、函数参数传递、面向对象、协程及Gin框架的使用。通过实例演示了Go语言的特点和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Golang 是一门诞生 10 来年左右的“新”的编程语言(2009 年开源,相比 C 和 Java 是新语言),但是很多人推荐学习它,因为它的并发编程很方便,还有 Docker 是使用 Golang 开发的杀手级应用。因此我也打算简单了解一下,算是拓宽一下自己的知识面,或者有一天可以用到它。无论怎样吧,我把我学习的内容进行了整理,方便其他有意向的同学可以进行快速了解。

      Golang 也被称为 Go,或者 Go 语言。我并没有按照一般的学习路线进行学习,毕竟我已经具备了一些其他编程语言的基础,比如 Java、PHP、C 等。因此,我大体从五个方面对 Go 语言进行了学习,我学习的内容包括 指针、函数参数的传递、面向对象、协程 和 Gin 框架的简单使用。如果读者完全是一个编程小白,就是没有任何编程语言的基础,那么这篇文章并不适合阅读,因为我只是挑了几个自认为的重点进行了学习了解,因此至少要了解一门高级编程语言再读我整理的这篇文章。

      接下来,我开始介绍对于 Go 我学习的几个点。

指针

      指针被称为 C 语言的灵魂,同时也是被很多非 C 语言程序员望而生畏的一个特性。Java、C# 等语言虽然也会有报出类似“空指针”这样的异常,但是 Java 和 C# 已经在有意的将这个概念淡化掉,甚至不再提它。但是,Go 语言中是有这个概念的。

       提到指针,就不得不提 C 语言的指针。C 语言的指针可以简单的被理解为是一个内存地址,但我认为这么理解其实并不严谨。我在学 C 语言的时候,书上和老师都说“指针就是一个地址”,但是我觉得很奇怪,“指针”既然是一个“地址”,为什么不直接了当的说它是一个“地址”,而是要称呼它为“指针”。后来经过自己的使用,好像明白了其中的原因。“地址”表示的是内存的一个编号,而“指针”表示的是一块内存的起始位置。也就是说,“指针”是有类型和长度的。而 指针 的类型关系到了 指针 的 加法 和 减法 的运算。

       在 C 语言中,指针常用的运算有 加法、减法、取地址 和 取内容。对应的运算符分别是:自增 1(++)、自减 1(--)、自增(+=)、自减(-=)、取地址(&) 和 取内容(*)。C 语言的指针在进行 加法 和 减法 运算的时候,是根据 指针类型的不同 所移动的地址长度是不同的,这点是很关键的一点,往往这点也是比较难理解的一点,尤其是操作 多级指针 和 多维数组 的时候。不过,好在 C 语言中的 指针自增、自减 的这些操作在 Go 语言中都没有。在 Go 语言中,只有 取地址(&) 和 取内容(*)两个操作,因此,我们只关心 & 和 * 即可。

      对于 Go 语言的指针相对于 C 语言的指针而言是非常简单的,这里通过一个简单的例子,来了解一下 Go 语言这两个运算符的使用方法。先来看 取地址 运算符 & 的用法。

package main

import "fmt"

func main() {
	var i int
	i = 10

	fmt.Printf("%x, %d\r\n", &i, i)
}

       上面的代码中,定义了一个整型变量 i,然后通过 fmt.Printf() 来输出了 变量 i 的地址 和 变量 i 的值。上面的内容输出如下:

src>go run point.go
c0000a2058, 10

       上面输出中的 c0000a2058 就是变量 i 的地址(地址的输出会因操作系统版本、补丁版本、Go 编译器版本的不同而不同),因此只要在变量前使用 & 就可以得到变量的地址,看下面的示意图。

图片

      上面的变量 i 是一个通常情况下的普通变量,接着我们来看一下 指针变量。我们来定义一个 指针类型 的变量,代码如下:

package main

import "fmt"

func main() {
	var i int
	var p *int

	i = 10
	p = &i

	fmt.Printf("%x, %d\r\n", &i, i)
	fmt.Printf("%x, %x, %d\r\n", &p, p, *p)
}

       在上面的代码中,定义了 整型指针类型 的变量 p,指针变量中存放的是一个内存地址,我们就可以将 i 的地址赋值给 p,又因为 变量 i 是 int 类型,因此需要将 p 定义为 *int 类型。因为 p 是 指向整型的指针,指针中保存的是内存的地址,因此对 p 进行赋值的时候,在 整型 变量前加一个 & 符号,变量 p 中就保存了 i 的地址。上面代码的输出结果如下:

src>go run point.go
c00000a0c0, 10
c000006028, c00000a0c0, 10

       上面的输出,第一行输出的是变量 i 的 地址 和 值,第二行的输出,分别是 p 的地址,p 指向的地址 和 p 指向的地址中的值,从指针变量中取出它指向的变量的值,需要使用 * 运算符。对于一个 普通变量 而言,有它的地址,和它的值。而对于一个 指针变量 而言,有它的地址、它指向的地址(其实就是它的值),还有它指向的地址中的值。它们之间的关系大致如下图所示。

图片

       指针变量在使用之前需要进行初始化,无论是取值、还是赋值,这点和 C 语言一样。不过在 Go 语言中的指针如果没有初始化,直接输出指针变量的值为 0,这点与 C 语言不太相同。但是,在 Go 语言中对未初始化的指针取内容,则和 C 语言中的情况是一样的,即“内存访问违例”。代码如下&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农UP2U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值