写在前面:题目就是个标题党,在这里先道歉,其次撸主学过很多语言(基本上是个语言都要上一下的那种人,但是不会太深入,只做了解,因为很多用不到),但主要使用C#语言(不过已经开始恶心C#的臃肿,不要打我),还有一点:这只是一篇记录我对go语言观后感的博客,只是肤浅的走马观花,并不是go语言的教程!
好了,前戏完了,进入正题
背景故事:今天上班略闲(你每天都很闲好嘛!所以钱包很可怜,唉),然后用PHP的时候有点恶心它的全局变量和闭包,又想起了前几天看大神帖子说C已经都快不行了,go和Rust很屌,于是看了下Rust,感觉有点复杂(毕竟是可以编写操作系统的语言。。。),相比之下go则精简许多,然后抽了上午浏览了一遍网上的教程,虽然只是照着写了几个例子,但确实惊叹于语法的简洁(前提是有C语言基础,不然一个指针可能就要被卡死。。。如果有动态脚本语言基础,也能加速理解其中某些部分),感觉这是一门融合了很多语言特色的混合语言。
- 第一部分,C语言过程式风格(过程式与函数式风格是两个对立的编程模型)
大概因为go语言的设计者,跟C语言有点渊源,所以基本的变量,函数定义这些,还是有着很浓重的C风格,还有struct,变量的作用域跟C语言保持一致,基本的流程控制也大致相同,顺便吐槽下,为什么博客园的编辑器的代码编辑里没有go语言!有一个比较重要的点,学过C的人都知道,C语言的强大,很大部分源于指针,可以直接操作硬件地址!go里面也有指针,虽然跟C里的虽然用法差不多,但是总感觉少了点什么(没错,好像不需要自己分配释放内存!),因为有垃圾回收(良心啊!)
var a int = 10 var b = 10 c : = 10 var a int= 20 /* 声明实际变量 */ var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ //结构体 type Books struct { title string author string subject string book_id int }
- 第二部分,基础的数据结构
跟其他语言类似,支持数组,列表(序列),字典(map)
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0} //一个float数组 //字典 var countryCapitalMap map[string]string /* 创建集合 */ countryCapitalMap = make(map[string]string) /* map 插入 key-value 对,各个国家对应的首都 */ countryCapitalMap["France"] = "Paris" countryCapitalMap["Italy"] = "Rome" countryCapitalMap["Japan"] = "Tokyo" countryCapitalMap["India"] = "New Delhi"
- 第三部分,面向对像
这部分语法和普通语言(C#,JAVA)区别有点大,但本质是一个东西,是在struct上额外的添加函数(叫方法),比较特别的是它有一个interface,了解不深,请看管自行研究
/* 定义函数 */ type Circle struct { radius float64 } //该 method 属于 Circle 类型对象中的方法 func (c Circle) getArea() float64 { //c.radius 即为 Circle 类型对象中的属性 return 3.14 * c.radius * c.radius }
- 第四部分,脚本语言特色
PHP,js这类脚本语言都会有闭包这个概念(这个其实是函数式编程风格的特色),匿名函数(好吧,C#里面也有,Lamdba表达式),go语言里面也有
支持多值操作,还有函数可以返回多个值(大概是放在类似于元组之类的里面)
a, b = b, a//直接交换两个值,是不是很眼熟,很多脚本语言是可以这样的!!! //闭包 func getSequence() func() int { i:=0 return func() int { i+=1 return i } } /* 声明函数变量 ,函数可以直接复制给变量*/ getSquareRoot := func(x float64) float64 { return math.Sqrt(x) } /* 使用函数 */ fmt.Println(getSquareRoot(9))
- 第五部分,语言独特部分
go从语法层次支持了goroutine + channel生产者-消费者模式,实现高并发模型!我不知道这一部分是不是和Erlang语言有类似。一般支持高并发的语言都有函数式风格的影子,函数式风格的很多概念非常适合高并发的并行运算。
//一个最基本的例子
func main() { chan1 := make(chan int)//生成一个channel,相当于一个消息队列 go func() { //运行一个goroutine,大概类似于线程,但不是一个东西 chan1 <- 1 //放入数据 }() fmt.Println(<-chan1) //读取显示数据,会等待上面那个函数执行完毕 }
因为只是大致的浏览了一遍,很多细节部分并没有太深入,然后也没什么实用经验,只是一个大致的感觉,思维比较混乱,可能会有很多错误的地方,但是我觉得go还是很不错的一门语言,简洁,性能不错,值得学习!(不要吐槽屎一样的排版),因为比较激动的想要把这门不错的语言推荐给大家,所以写的很匆忙(你就是懒得想好嘛!),不足之处,还请不要吹毛求逼,谢谢观看,祝您身体健康(笑)!
请发表评论