编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

每天2分钟学习GO语言编程(一)GO语言基本介绍和第一个GO语言程序

wxchong 2024-07-02 03:21:19 开源技术 47 ℃ 0 评论

最近儿子在看《啦咘啦哆警长》这个动画片,主题曲一响就是go go go go 啦咘啦多,此时此刻我竟然第一时间想到了GO语言,GO语言对我来说印象深刻。为什么会印象深刻呢?下面我一一道来,都是比较直观的感受。

一、内存篇

我第一份工作接触C语言,那时刚入职时,接手维护了一份C语言代码,指针满天飞,malloc一片内存后,最后都不知道把指针传到哪里去了,释放没释放不知道。有严重的内存泄漏,8G内存运行起来不到30分钟要得重启程序了。也不知道在我接手前他们怎么使用这套程序的。

最终费了九牛二虎之力,通过检测工具valgrind和c++map把申请和释放的内存地址映射起来,申请和释放都打上标记,最后找出来申请了没有释放的内存。内存泄漏就控制住了。后来与领导一商量就使用c++对这个代码重构了。这里也提倡一下,c/c++里面在写函数和方法时如果需要要申请内存传到外面,一定要写注释让使用者及时把内存释放。或者使用特殊手段借c++的构造和析构这一对函数来保证只要能执行到析构就保证释放内存。

扯得有点远了,想说啥呢?就是GO的内存是自带垃圾回收,开发者不需要关心内存申请和释放了,这就大大减小了入门的门槛。虽然GO中也有指针,但是是安全的,开发者只管使用就好了。

二、并发篇

2.1 锁与channel

没有接触到GO时,凡是有并发必定是要加锁的。因为涉及到临界资源(竞争资源),所以不加锁就会造成访问错误得不到正确结果,严重时内存崩溃。

GO有一句至理名言:"Don’t communicate by sharing memory; share memory by communicating;不要通过共享内存来通信,而应该通过通信来共享内存"。这是作为Go语言的主要创造者之一的Rob Pike的至理名言。GO之所以有这句至理名言,是因为它有channel,有了这个通道几乎90%用锁的地方根据就不需要用锁了,两个线程(goroutine)之间交互就通过channel就可以了。这个后面开讲之后应该有机会遇到如何运用的。

2.2传统线程与goroutine

传统线程,cpu切换时要做上下文切换,保存现场,再恢复另一个线程的现场,涉及到操作系统内核与用户空间的数据交换。存在线程之间对cpu时间片的抢占。传统线程默认栈空间需要8M.

goroutine呢是轻量的线程,它切换只是用户空间的保存保存现场和切换,代价要小很多。而go的自身的调度策略,保证各个goroutine都有机会执行到,轻易不会发生抢占。利用cpu更高效。goroutine默认栈空间需要2K.

三、其它的特性

3.1函数多返回值

函数多返值是相比较C/C++来说是有一定的优势的。在C/C++中,一个函数要返回错误有两种方式,一种是通过errno,一个种是通过函数返值,但往往的情况是函数返回值只能有一个,这时没办法,要么通过函数传参获取返值,或者返值是结构体。但这样并不简洁,可读性也不友好。通过传参获取返值,最好参数名字带上in或者out,最好in的参数加上const。这样可读性有所提高。但还是没有GO的这种方法简单直接。GO的多返回值 ,就可以做到参数全是入参,返回值有多个就自由了,可以返回一个错误和多个值。

3.2非入侵式的接口

c++中要想实现接口,必须继承过来接口类,再按照接口类的定义实现具体的方法。而在GO中接口定义是明确的,但实现是独立的甚至是模糊的,也就是说可以完全互不相关,直到使用的时候又是明确的。这样一来就非常强大和灵活了。这就是常说的鸭子类型,只要实现了鸭子的叫声,那么这个就是鸭子。意思就是在使用时只要你实现了接口的函数列表,那么就能把你的对象赋值给某个接口。从而就实现了多态,不同的动物实现不同的叫声。

这个特性后面会讲到。

3.3组合式的继承

组合式的继承,可以复用已经实现过了的结构。思想较为简单降低学习曲线。c++里面有多重继承,方法可以重载,重写等,还有虚函数表,虚函数指针等,这一套下来比较复杂。GO也崇尚大道至简。它本身借鉴了很多语言的特长,如果有些机制拿过来并不能带来很大好处,反而增加复杂度,可能就不会支持。

这个特性就先聊这么多了。后面细节中有遇到再进行做对比和阐述。

四、第一个GO程序

go的环境大家自行安装一下,如果不会安装或者有困难可以在评论区或者私信我。至于开发工具ide看各位自己的喜好了。我习惯了使用的是goland,并且我常使用的环境是linux的debian发行分支。当然linux系统下也可以使用vi和gedit。windows下可以使用eclipse,LiteIDE等。

任何语言的学习都是从hello world开始的,这次也不例外。来把下面的代码保存为first.go:

package main  //主包名,程序必须要有此包。

func main() {  //主函数,程序入口函数,与c/c++的main作用一样。
	println("hello world.")  //输出hello world.
}

在命令行终端下直接运行:

go run ./first.go
hello world.

说明一下:我使用的GO的版本是Go 1.18.3或者Go 1.19.2。后面的学习例子就是这两个版本。

好了,这一期分享到这里,再次感谢大家的支持。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表