Golang-Day1
该笔记是在熟练掌握一门后端语言(Java、C++)的基础上快速入门Golang
Golang的语言特性
Golang的优势
部署简单
- 可直接编译成机器码执行
- 不依赖其他库
- 直接运行即可部署
静态类型语言
- 编译的时候即可检查出来隐藏的⼤多数问题
语言层面的并发
- 天生基因支持并发
- 充分的利用多核
强大的标准库
runtime
系统调度机制- 高效的 GC 垃圾回收
- 丰富的标准库 (特别是网络库非常强大)
简单易学
- 仅有25个关键字
- 继承了C语言简洁基因,内嵌C语法支持
- 面向对象特征
- 跨平台支持
庞大的社区生态
- 国外有 Google 和 Facebook 两大巨头使用,国内也有腾讯、七牛云、字节等一众大厂的簇拥
- 具有明星级别的开源项目 Docker 和 Kubernetes,是云原生应用的重要基石
Golang适用场景
- 服务器编程,以前你如果使用 C 或者 C++ 做的那些事情,用 Go 来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
- 分布式系统,数据库代理器等
- 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用、
- 内存数据库,前一段时间 Google 开发的 GroupCache,Couchbase 的部分组建
- 云平台,目前国外很多云平台在采用 Go 开发,CloudFoundy 的部分组建,前 VMware 的技术总监的 Apcera 云平台。
Golang的知名项目
项目名 | 简介 |
---|---|
NSQ | Bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息 |
Docker | 基于LXC的一个虚拟打包工具,能够实现PAAS平台的组建。 |
Packer | 用来生成不同平台的镜像文件,例如VM、VBox、AWS等,作者是Vagrant的作者 |
Skynet | 基于Actor模式的分布式调度框架 |
Doozer | 分布式同步工具,类似ZooKeeper |
Heka | Mazila开源的日志处理系统 |
CBFS | Couchbase开源的分布式文件系统 |
Tsuru | 开源的PAAS平台,和SAE实现的功能一模一样 |
GroupCache | memcahe作者写的用于Google下载系统的缓存系统 |
Godis | 类似Redis的缓存系统,但是支持分布式和扩展性 |
Gor | 网络流量抓包和重放工具 |
Golang的不足
- 包管理,大部分包托管在Github,可能存在失效的风险
- 无泛化类型(传闻2.0版本将加入)
- 所有Exception都用Error来处理
- 对C的降级处理,并非无缝衔接,没有C降级到ASM那么完美(主要是序列化问题)
Golang的基础语法
从hello world进入Golang的世界
Golang中的表达式,以”;”结尾或者不以”;”结尾都可以,但建议不添加
函数的 { 一定是和函数名在同一行,否则编译报错
package main 需要声明程序的包名
import的两种写法
- import “fmt”
import “time”
- import ( “fmt” “time” )
变量
变量的声明
局部变量的声明
⽅法⼀:声明⼀个变量,若不初始化则默认值为0
var a int
方法二:声明一个变量,初始化一个值
var b int = 1
方法三:在初始化时,可以省去数据类型,通过值自动匹配当前变量的数据类型
var c = 1
方法四(常用):省去 var 关键字,直接自动匹配
e := 1
全局变量的声明
除方法四外均可支持定义全局变量
多变量声明
单行写法
- var xx, yy int = 100, 200
- var ii , jj = 100, “Pluto”
多行写法
var (
nn int = 1
mm bool = true
)
示例代码
常量与iota
常量
常量由关键字const声明,类似于Java中的Enum枚举类型
const a int = 1
const (
a = 1
b = 2
)
iota
iota是预先声明的标识符,只能作用于const常量声明内,默认值为0,逐行递增1,可搭配运算符使用
const (
// a = 0, b = 0, c = 0
a, b, c = iota, iota, iota
)
示例代码
函数
多返回值
Golang拥有多种方式返回多个返回值,如下代码
init函数与import导包
init函数
程序入口为main,循环往后寻找import,如果无下一层import则执行init()方法,而后才执行main()方法
项目结构
$GOPATH/GolangStudy/5.init/
├── lib1/
│ └── lib1.go
├── lib2/
│ └── lib2.go
└── main.go
示例代码
运行结果即可一窥代码运行顺序
lib1.init()...
lib2.init()...
lib1Test()...
lib2Test()...
import导包
- import _ “fmt”
- 给fmt包起⼀个别名,匿名, ⽆法使⽤当前包的⽅法,但是会执⾏当前的包内部的init()⽅法
- import a“fmt”
- 给fmt包起⼀个别名,a, 可以使用a.Println()来直接调⽤
- import . “fmt”
- 将当前fmt包中的全部⽅法,导⼊到当前本包的作⽤中,fmt包中的全部的⽅法可以直接使⽤API来调⽤,不需要fmt.API来调⽤,即直接编写Println()
指针
指针通道即和C语言一致,这里就不再过多赘述
指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
以下为一个简单例子
示例代码
示例代码通过一个swap()函数来体现指针的作用,即swap的是内存地址而并非单纯引用值
第一天的Golang之旅就暂时到这,第二天继续学习基础语法
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!