
Go 学习:那些不一样的知识点(下)
在上一篇《Go 学习:那些不一样的知识点(上)》中已经提到了 10 个 Go 语言中有特点的地方,本文继续介绍一些 Go 语言中语法或使用方式比较独特的知识点。
11、切片类型
同 Python 一样,Go 语言中也支持切片类型,而 C# 在 C# 8 中也增加了对数组进行切片操作的语法糖,先来看一个 C# 的例子:
在 Go 语言中使用 make 关键字来构建切片:
12、range 的使用
在上一篇的示例中,遍历 map 的时候有使用过 range,而 range 的作用不仅能遍历 map ,还可以遍历数组、切片、字符串等:
13、指针
上大学时学习 C 语言有学习过指针,C# 虽然也能使用指针,但不常用,而且是在有限范围内使用,C# 的指针是一个持有另一类型内存地址的变量,在 C# 中,指针只能被声明为持有值类型和数组的内存地址,指针类型不被默认的垃圾收集机制所跟踪。
下面看看 Go 中的指针使用:
- 使用数值传递时,函数中对参数值进行了修改,但不会影响原值;
- 对指针类型的参数赋值时,需要添加 & 符号,表示传递的不是 i 的值,而是 i 的值对应的地址,所当函数内对这个地址的值进行修改后,原值也会发生变化。
14、结构体和方法
在 Go 语言中没有类的概念,取而代之的是结构体,结构体使用 struct 关键字声明:
如果想在上面例子中 userInfo 结构体中添加方法,并不是写在结构体的内部,看下面的代码:
- 通过在定义函数的时候指定一个结构体类型的实例,就可以将函数变成结构体的方法了;
- 有点像是 .NET 中的扩展方法。
15、接口
在 Go 语言中,接口是非入侵性的,接口的实现不依赖接口的定义,这一点跟 C# 有很大的不同。
跟结构体的方法不需要结构体的内部一样,接口的实现也不要显示的声明,只需要方法的签名和接口中的方法签名相同,就算是实现了接口方法。
16、并发
Go 语言因为出生的比较晚,在设计之初就考虑到了并发编程的场景,并以原生支持并发著称,下面以一个简单的例子来感受下 Go 的并发:
上面代码执行的结果为:
使用 go 关键字异步调用的方法并没有打印出来,因为主线程不会等异步函数执行就会继续往下走,然后程序就运行结束了,可以在调用后 sleep 1 秒钟来让异步调用的结果能打印出来:
上面只有一个异步函数的调用,如果有多个异步函数调用,那么这些异步函数的调用顺序是随机的,有兴趣的朋友可以自己试试看。
17、通道
在 Go 语言中可以很方便地使用并发,那么在并发中多个线程怎么通信,就要用到通道了。通道使用关键字 chan 定义,使用 make 类构建通道,下面代码创建了一个字符类型的通道:
假设有这样一个场景:
1、用一个匿名异步函数来处理耗时操作,比如同步数据,使用通道反馈给主线程进度;
2、在主线程中实时更新进度。
运行效果为,每隔一秒,输出一条进度信息,全部输出完结果如下:
18、异常处理
在 Go 语言中没有 C# 中 try catch 的异常处理机制,而采用的是使用返回值的判断,Go 语言的一些内置函数就是使用多返回值来处理异常,比如:strconv.Atoi ,看下面的例子:
当 age 的值不是数字的时候,就会打印出错误:
我们自定义的函数也可以通过多返回值的方式来返回错误:
总结
到这,Go 语言的学习应该就算是入门了,接着可以针对 Go 的并发进行深入研究,还可以学习下在 Go 语言中是怎么使用面向对象编程的?怎样进行数据库的操作?一些常用库是如何使用的?怎样进行 Web 开发 ?等等...
然后拿 Go 语言去做一些实际的小项目,比如:SSG 类型的博客系统、容器的发布部署系统等等。在实际做项目的过程中,不断地解决问题,慢慢就可以从入门到精通了,当然,也可能从入门到放弃。
文章转载自公众号:不止dotNET
