golang入门

1.go语言介绍

1.什么是go?

Go语言是谷歌2009发布的第二款开源编程语言。是从B语言、C语言逐步演化过来的,是C语言家族成员,因此很多人将Go语言称为21世纪的C语言。现如今Go语言已经成为云计算、云存储时代最重要的基础编程语言(摘自Go语言圣经)。

Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。

2.为什么选择go,与其它语言相比,有哪些优点

  • 容易入手
    基本语法不多,几天时间就能大概掌握
  • 效率
    Go拥有接近C的运行效率和接近PHP的开发效率,这就很有利的支撑了上面大家追求快速的需求。
  • 自由高效
    Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程。我们可以各取所需、自由组合、灵活应用。
  • 丰富的标准库
    这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。

3.Go语言主要特征

1、内置runtime,支持自动垃圾回收,像java、c#、python等语言自带GC,不用为内存回收苦恼。

2、丰富的内置数据类型,像map、slice这些常用的数据类型。

3、函数返回多值,多值返回仅动态语言Python有此特征。

4、可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,它可以在一台计算机上几秒内编译出一个大型的Go语言程序。

5、Go语言层面天生支持并发,这是Go语言最大的特色,可以充分的利用多核,很容易的实现并发操作。 从语言级别支持并发,通过轻量级协程 Goroutine 来实现程序并发运行。多核 CPU 可以让同一进程内的 “多个线程” 做到真正意义上的同时运行,这才是并行。

6、Go语言内嵌C语言支持(其作者就包括C语言的作者),所以Go语言里面也可以直接包含C语言代码,利用现有的丰富的C语言库。

7、Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级。

4.Go能做什么?

  • Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;
  • 网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都在采用Go开发。

5.使用者有哪些

  • 360
    360对Golang的使用也不少,一个是开源的日志搜索系统Poseidon,托管在Github上,https://github.com/Qihoo360/pos

  • 小米
    小米对Golang的支持,莫过于运维监控系统的开源,也就是 http://open-falcon.com/

  • 京东
    京东云消息推送系统、云存储,以及京东商城等都有使用Go做开发。

  • 百度
    目前所知的百度的使用是在运维这边,是百度运维的一个BFE项目,负责前端流量的接入。他们的负责人在2016年有分享,大家可以看下这个http://www.infoq.com/cn/presentati

  • Facebook
    Facebook也在用,为此他们还专门在Github上建立了一个开源组织facebookgo,大家可以通过 https://github.com/facebookgo 访问查看facebook开源的项目,比如著名的是平滑升级的grace。

  • 腾讯
    腾讯作为国内的大公司,还是敢于尝试的,尤其是Docker容器化这一块,他们在15年已经做了docker万台规模的实践,具体可以参考:http://www.infoq.com/cn/articles/t

5.Go语言成熟的项目

1、nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息

2、docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建

3、kubernetes:Google出品,用于调度和管理Docker的开源容器管理系统,利用他,可以方便的管理你的docker实例,哪怕非常多,也是目前最流行的docker管理系统。

4、etcd:一款分布式的,可靠的K-V存储系统,使用简单,速度快,又安全。

5、packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者

6、skynet:分布式调度框架

7、Doozer:分布式同步工具,类似ZooKeeper

8、Heka:mazila开源的日志处理系统

9、cbfs:couchbase开源的分布式文件系统

10、tsuru:开源的PAAS平台,和SAE实现的功能一模一样

11、groupcache:memcahe作者写的用于Google下载系统的缓存系统

12、god:类似redis的缓存系统,但是支持分布式和扩展性

13、gor:网络流量抓包和重放工具

14、hugo:一款极速的静态页面生成器,让你可以很快的搭建个人网站,提供了多套主题可供使用,并且可以自己定制,和NodeJS的Hexo是一样的。

15、grafana:一款开源监控度量的看板系统,可以接

16、Graphite,Elasticsearch,InfluxDB等数据源,定制化很高。

17、caddy:快速的,跨平台的HTTP/2 Web服务器。

18、beggo:国产开源的高性能Web框架,让你快速的开发Go Web应用服务,谢大主笔。

19、codis:Codis是一个分布式Redis解决方案,其实就是一个数据库代理,让你在使用Redis集群的时候,就像使用单机版的Redis是一样的,对开发者透明。

20、pholcus:Pholcus(幽灵蛛)是一款纯Go语言编写的支持分布式的高并发、重量级爬虫软件,定位于互联网数据采集,为具备一定Go或JS编程基础的人提供一个只需关注规则定制的功能强大的爬虫工具。

2.入门-Hello World

(本地环境的部署,以及新建一个demo项目)

1.环境配置

go语言支持以下系统:

  • Linux
  • FreeBSD
  • Mac OS X
  • Windows
    安装包下载地址为:https://golang.org/dl/。

如果打不开可以使用这个地址:https://golang.google.cn/dl/。
windows安装方法:

  • 下载.msi后缀文件,本地安装后,会生成Go文件夹在安装目录下。
  • 选择安装的目录例如C:\Go\bin,添加到Path环境变量中。

2.编译工具

  • GoLand
    是一款专业的Go 跨平台IDE,提供智能代码辅助、智能代码导航等功能,拥有众多工具集成及1000 + 插件,支持主流Web 开发。 方便开发人员编写易于维护的简洁代码,同时高效地进行应用程序的运行和调试。缺点是收费昂贵!
  • VS Code
    Visual Studio Code(简称VS Code)是一款由微软开发且跨平台的免费源代码编辑器。 该软件支持语法高亮、代码自动补全(又称IntelliSense)、代码重构、查看定义功能,并且内置了命令行工具和Git版本控制系统。支持以下几种语言:F#、HandleBars、Python、Jade、PHP、PowerShell、HTML、JSON、TypeScript、Go、C++、C#、Objective-C、CSS、JavaScript等
    (进行go语言开发,需要对VS Code配置,可以参考https://zhuanlan.zhihu.com/p/320343679)

3.基本语法

https://www.runoob.com/go/go-concurrent.html

  • 语言结构:Go Hello World 实例
    Go 语言的基础组成有以下几个部分:包声明,引入包,函数,变量,语句 & 表达式,注释。与大部分语言差不多。
    接下来让我们来看下简单的代码,该代码输出了"Hello World!":
package main

import "fmt"

func main() {
     
   /* 这是我的第一个简单的程序 */
   fmt.Println("Hello, World!")
}
  • 数据类型
    golang入门_第1张图片

golang中分为值类型和引用类型

值类型分别有:int系列、float系列、bool、string、数组和结构体

引用类型有:指针、slice切片、管道channel、接口interface、map、函数等

值类型的特点是:变量直接存储值,内存通常在栈中分配

引用类型的特点是:变量存储的是一个地址,这个地址对应的空间里才是真正存储的值,内存通常在堆中分配

  • 变量声明
    三种变量声明效果基本相同
var s string = "apple"
var s = "apple"
s := "apple"
  • 函数

函数是基本的代码块,用于执行一个任务。

Go 语言最少有个 main() 函数。

你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。

函数声明告诉了编译器函数的名称,返回类型,和参数。

Go 语言标准库提供了多种可动用的内置的函数。例如,len()
函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。

/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {
     
   /* 声明局部变量 */
   var result int

   if (num1 > num2) {
     
      result = num1
   } else {
     
      result = num2
   }
   return result
}
/*返回多个值*/
package main

import "fmt"

func swap(x, y string) (string, string) {
     
   return y, x
}

func main() {
     
   a, b := swap("Google", "Runoob")
   fmt.Println(a, b)
}

你可能感兴趣的:(go,go)