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的两种写法

    1. import “fmt”

    ​ import “time”

    1. 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导包

  1. import _ “fmt”
    • 给fmt包起⼀个别名,匿名, ⽆法使⽤当前包的⽅法,但是会执⾏当前的包内部的init()⽅法
  2. import a“fmt”
    • 给fmt包起⼀个别名,a, 可以使用a.Println()来直接调⽤
  3. import . “fmt”
    • 将当前fmt包中的全部⽅法,导⼊到当前本包的作⽤中,fmt包中的全部的⽅法可以直接使⽤API来调⽤,不需要fmt.API来调⽤,即直接编写Println()

指针

指针通道即和C语言一致,这里就不再过多赘述

指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

以下为一个简单例子

image-20210513203408898

示例代码

示例代码通过一个swap()函数来体现指针的作用,即swap的是内存地址而并非单纯引用值


第一天的Golang之旅就暂时到这,第二天继续学习基础语法


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!