写在前面:题目就是个标题党,在这里先道歉,其次撸主学过很多语言(基本上是个语言都要上一下的那种人,但是不会太深入,只做了解,因为很多用不到),但主要使用C#语言(不过已经开始恶心C#的臃肿,不要打我),还有一点:这只是一篇记录我对go语言观后感的博客,只是肤浅的走马观花,并不是go语言的教程!

好了,前戏完了,进入正题

  背景故事:今天上班略闲(你每天都很闲好嘛!所以钱包很可怜,唉),然后用PHP的时候有点恶心它的全局变量和闭包,又想起了前几天看大神帖子说C已经都快不行了,go和Rust很屌,于是看了下Rust,感觉有点复杂(毕竟是可以编写操作系统的语言。。。),相比之下go则精简许多,然后抽了上午浏览了一遍网上的教程,虽然只是照着写了几个例子,但确实惊叹于语法的简洁(前提是有C语言基础,不然一个指针可能就要被卡死。。。如果有动态脚本语言基础,也能加速理解其中某些部分),感觉这是一门融合了很多语言特色的混合语言。

  • 第一部分,C语言过程式风格(过程式与函数式风格是两个对立的编程模型)

大概因为go语言的设计者,跟C语言有点渊源,所以基本的变量,函数定义这些,还是有着很浓重的C风格,还有struct,变量的作用域跟C语言保持一致,基本的流程控制也大致相同,顺便吐槽下,为什么博客园的编辑器的代码编辑里没有go语言!有一个比较重要的点,学过C的人都知道,C语言的强大,很大部分源于指针,可以直接操作硬件地址!go里面也有指针,虽然跟C里的虽然用法差不多,但是总感觉少了点什么(没错,好像不需要自己分配释放内存!),因为有垃圾回收(良心啊!)


c : =
   /* 声明实际变量 */
var ip *int        /* 声明指针变量 */
ip = &a  /* 指针变量的存储地址 */

//结构体
type Books struct {
   title string
   author string
   subject string
   book_id int
}
  • 第二部分,基础的数据结构

跟其他语言类似,支持数组,列表(序列),字典(map)

]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:=
   return func() int {
      i+=
     return i
   }
}

   /* 声明函数变量 ,函数可以直接复制给变量*/
   getSquareRoot := func(x float64) float64 {
      return math.Sqrt(x)
   }

   /* 使用函数 */
   fmt.Println(getSquareRoot())
  • 第五部分,语言独特部分

go从语法层次支持了goroutine + channel生产者-消费者模式,实现高并发模型!我不知道这一部分是不是和Erlang语言有类似。一般支持高并发的语言都有函数式风格的影子,函数式风格的很多概念非常适合高并发的并行运算。

//一个最基本的例子
func main() { chan1 := make(chan int)//生成一个channel,相当于一个消息队列 go func() {  //运行一个goroutine,大概类似于线程,但不是一个东西 chan1 <- 1 //放入数据 }() fmt.Println(<-chan1) //读取显示数据,会等待上面那个函数执行完毕 }

因为只是大致的浏览了一遍,很多细节部分并没有太深入,然后也没什么实用经验,只是一个大致的感觉,思维比较混乱,可能会有很多错误的地方,但是我觉得go还是很不错的一门语言,简洁,性能不错,值得学习!(不要吐槽屎一样的排版),因为比较激动的想要把这门不错的语言推荐给大家,所以写的很匆忙(你就是懒得想好嘛!),不足之处,还请不要吹毛求逼,谢谢观看,祝您身体健康(笑)!

Go语言是我见过最简洁的语言(除了lua)的更多相关文章

  1. OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁;

    OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁: 支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能 ...

  2. Golang笔记(一)简洁的语言风格

    Golang笔记(一)简洁的语言风格 概述 Golang继承了很多C语言的风格,寡人使用了十几年C语言,切换到Golang时上手很快,并且随着深入的使用,越来越喜欢这门语言.Golang最直观的感受是 ...

  3. 【Go语言系列】1.3、GO语言简介:Go语言开发的知名项目

    下面列举的是原生使用Go语言进行开发的部分项目.1.DockerDocker 是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器.Docker 可以在一台物理服务器 ...

  4. 「C语言」Windows+EclipseCDT下的C语言开发环境准备

    之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...

  5. c语言学习笔记(1)——c语言的特点

    一.c语言概述 1.为什么学习c语言? (1)c的起源和发展 第一代语言:机器语言  1101 第二代语言:汇编语言  add ax,bx; 第三代语言:高级语言  a+b; 结构化:c fortra ...

  6. D、GO、Rust 谁会在未来取代 C?为什么?——Go语言的定位非常好,Rust语言非常优秀,D语言也不错

    不要管我的地位和 D 语言创造者之一的身份.我会坦诚的回答这个问题.我熟悉 Go 和 Rust,并且知道 D 的缺点在哪里.我鼓励人们在 Rust 和 Go 社区相似身份的人,也可以提出他们诚恳的观点 ...

  7. C语言的本质(15)——C语言的函数接口入门

    C语言的本质(15)--C语言的函数接口 函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为实现者提供某些条件,在函数返回时,实现者完成调用者需要的功能. 函数接口通过函数名,参数和返 ...

  8. C语言的本质(7)——C语言运算符大全

    C语言的本质(7)--C语言运算符大全 C语言的结合方向 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左).例如算术运算符的结合性是自左至右,即先左后右.如有表达式 x- ...

  9. R语言︱H2o深度学习的一些R语言实践——H2o包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言H2o包的几个应用案例 笔者寄语:受启发 ...

随机推荐

  1. Linux下查询进程PS或者杀死进程kill的小技巧

    假设我们要kill掉tomcat: 那么我们首先需要tomcat的进程号pid: ps -aux | grep tomcat 记下tomcat的PID后,执行:kill PID(tomcat) 好了, ...

  2. oracle未归纳

    配置文件路径 路径:F:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN.配置文件解释如下: listener.ora:打开后内容如下 ...

  3. MySQL数据库操作

    一创建数据库 1 语法(help create database) CREATE DATABASE 数据库名 charset utf8; 2 数据库命名规则: 可以由字母.数字.下划线.@.#.$ 区 ...

  4. UGUI 粒子特效与UI层级问题

    游戏中,界面上有些按钮之上需要放置一个特效,或者有些区域显示比如image上显示一个特效,这时候如果再打开一个UI,我们需要让新的UI显示在特效上层,而不是被特效遮挡,这是就需要设置特效的渲染顺序. ...

  5. [认证授权] 6.Permission Based Access Control

    在前面5篇博客中介绍了OAuth2和OIDC(OpenId Connect),其作用是授权和认证.那么当我们得到OAuth2的Access Token或者OIDC的Id Token之后,我们的资源服务 ...

  6. 编码与模式------《Designing Data-Intensive Applications》读书笔记5

    进入到第四章了,本篇主要聊的点是编码(也就是序列化)与代码升级的一些场景,来梳理存储之中涉及到的编解码的流程.目前主流的编解码便是来自Apache的Avro,来自Facebook的Thrift与Goo ...

  7. SQLServer 创建服务器和数据库级别审计

    概述 在上一篇文章中已经介绍了审计的概念:本篇文章主要介绍如何创建审计,以及该收集哪些审核规范. 一.常用的审核对象 1.1.服务器审核对象 1.FAILED_LOGIN_GROUP( Audit L ...

  8. DAY6-小变化(java提示框)-2018-1-16

    终于有一点点小变化了,今天学习了java里的对话框,有四种类型:1.确认对话框(showConfirmDialog) 2.可选择输入的对话框(showInputDialog) 3.信息对话框(show ...

  9. Java多线程同步问题:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...

  10. 解析Linux中的VFS文件系统之文件系统的注册(二)

    继上一篇文章:http://www.cnblogs.com/linhaostudy/p/7397024.html 3. 文件系统的注册 这里的文件系统是指可能会被挂载到目录树中的各个实际文件系统,所谓 ...