Go语言特性

统一思想-12 factors
I. 基准代码
一份基准代码,多份部署
II. 依赖
显式声明依赖关系
III. 配置
在环境中存储配置
IV. 后端服务
把后端服务当作附加资源
V. 构建,发布,运行
严格分离构建和运行
VI. 进程
以一个或多个无状态进程运行应用
VII. 端口绑定
通过端口绑定提供服务
VIII. 并发
通过进程模型进行扩展
IX. 易处理
快速启动和优雅终止可最大化健壮性
X. 开发环境与线上环境等价
尽可能的保持开发,预发布,线上环境相同
XI. 日志
把日志当作事件流
XII. 管理进程
后台管理任务当作一次性进程运行

源自:Martin Fowler <企业应用架构模式>

1. 为什么需要另外一种语言?
2. Go 语言编译环境设置
3. 控制结构
4. Go 语言常用数据结构
5. Go 语言函数调用
6. 常用语法
7. 多线程
? 深入理解 channel
? 基于 channel 编写一个生产者消费者程序

1. 为什么需要 Go 语言

Go 语言的原则

Less is exponentially more越少越好

– Rob Pike, Go Designer

Do Less, Enable More少做多得
– Russ Cox, Go Tech Lead

为什么需要 Go 语言
? 其他编程语言的弊端。
? 硬件发展速度远远超过软件。
? C 语言等原生语言缺乏好的依赖管理 (依赖头文件)。
? Java 和 C++ 等语言过于笨重。
? 系统语言对垃圾回收和并行计算等基础功能缺乏支持。
? 对多核计算机缺乏支持。
? Go 语言是一个可以编译高效,支持高并发的,面向垃圾回收的全新语言。
? 秒级完成大型程序的单节点编译。
? 依赖管理清晰。
? 不支持继承,程序员无需花费精力定义不同类型之间的关系。
? 支持垃圾回收,支持并发执行,支持多线程通讯。
? 对多核计算机支持友好。

Go 语言不支持的特性
? 不支持函数重载和操作符重载
? 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
? 支持接口抽象,不支持继承
? 不支持动态加载代码
? 不支持动态链接库
? 通过 recover 和 panic 来替代异常机制
? 不支持断言
? 不支持静态变量

Go 语言特性衍生来源

2. Go 语言环境

下载 Go
? Go 安装文件以及源代码
https://golang.google.cn/dl/
? 下载对应平台的二进制文件并安装
? 环境变量
? GOROOT
l go的安装目录
? GOPATH
l src:存放源代码
l pkg:存放依赖包
l bin:存放可执行文件
? 其他常用变量
l GOOS,GOARCH,GOPROXY
l 国内用户建议设置 goproxy:export GOPROXY=https://goproxy.cn

IDE 设置(VS Code)
? 下载并安装 Visual Studio Code
https://code.visualstudio.com/downloa
? 安装 Go 语言插件
https://marketplace.visualstudio.com/items?itemName=golang.go
? 其他可选项
? Intellj goland,收费软件
? vim,sublim

一些基本命令

bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages to use new APIs
fmt gofmt (reformat) package sources
generate generate Go files by processing source
get add dependencies to current module and install them

install compile and install packages and dependencies
list list packages or modules
mod module maintenance
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet report likely mistakes in packages

Go build
? Go 语言不支持动态链接,因此编译时会将所有依赖编译进同一个二进制文件。
? 指定输出目录。
? go build –o bin/mybinary .
? 常用环境变量设置编译操作系统和 CPU 架构。
? GOOS=linux GOARCH=amd64 go build
? 全支持列表。
? $GOROOT/src/go/build/syslist.

Go test
Go 语言原生自带测试
import "testing"
func TestIncrease(t *testing.T) {
        t.Log("Start testing")
        increase(1, 2)
}

go test ./… -v 运行测试
go test 命令扫描所有*_test.go为结尾的文件,惯例是将测试代码与正式代码放在同目录,
如 foo.go 的测试代码一般写在 foo_test

 Go vet

代码静态检查,发现可能的 bug 或者可疑的构造
? Print-format 错误,检查类型不匹配的print
        str := “hello world!
        fmt.Printf("%d\n", str)        类型错误
? Boolean 错误,检查一直为 true、false 或者冗余的表达式

        fmt.Println(i != 0 || i != 1)
? Range 循环,比如如下代码主协程会先退出,go routine无法被执行
        words := []string{"foo", "bar", "baz"} 
        for _, word := range words {
                go func() {
                fmt.Println(word). 

                }()        这里没有传入信号,变量i

        }

? Unreachable的代码,如 return 之后的代码
? 其他错误,比如变量自赋值,error 检查滞后等
        res, err := http.Get("https://www.spreadsheetdb.io/") 
        defer res.Body.Close() 
        if err != nil {
                log.Fatal(err)

        }

代码版本控制
? 下载并安装 Git Command Line
? https://git-scm.com/downloads
? Github
? 本课程示例代码均上传在 https://github.com/cncamp/golang
? 创建代码目录
? mkdir –p $GOPATH/src/github.com/cncamp
? cd $GOPATH/src/github.com/cncamp
? 代码下载
? git clone https://github.com/cncamp/golang.git
? 修改代码
? 上传代码
? git add filename
? git commit –m 'change logs'
? git push

Golang playgroun
官方 playground
https://play.golang.org/
可直接编写和运行 Go 语言程序
国内可直接访问的 playground
https://goplay.tool

https://play.studygolang.com/

3. 控制结构

If
? 基本形式
if condition1 {
        // do something 
} else if condition2 {
        // do something else 
} else {
        // catch-all or default
}

? if 的简短语句
? 同 for 一样, if 语句可以在条件表达式前执行一个简单的语句。
if v := x - 100; v < 0{
        return v

}

switch
switch var1 {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值