Golang-C1-1

介绍

golang简介 Go语言是Google于2009年推出的一门新的系统编程语言。

特点

  • 静态编译
  • 垃圾回收
  • 简洁的符号和语法
  • 平坦的类型系统
  • 基于CSP的并发模型
  • 高效简单的工具链

作者

img

家谱

img

为什么选择go语言

  • 编译型语言,运行速度快
  • 静态编译没有依赖
  • 天生支持并发,充分利用多核
  • 大厂支持,有后台

helloword

1
2
3
4
5
6
package main
import "fmt"

func main() {
	fmt.Println("hello golang")
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, world!")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

c10k

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
func handler(conn net.Conn) {
	fmt.Fprintf(conn, "%s", time.Now().String())
	conn.Close()
}

func main() {
	l, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatal(err)
	}
	for {
		conn, err := l.Accept()
		if err != nil {
			log.Fatal(err)
		}
		fo handler(conn)
	}
}

并行和并发

  • 并发(concurrent)不是并行(parallel)
  • 一个例子,node.js具有并发的能力,但不能充分利用多核
  • 写出一个能充分利用多核的程序需要很深的系统编程积淀
  • 利益于优秀的设计,go可以轻松地写出跑满所有CPU的程序

go语言的应用

  • Docker,正火热的容器化技术
  • kubernetes,Google Borg的开源实现
  • Etcd,类似zookeeper的高可用key-value存储

课程安排

  • 基础部分
  • 进阶部分
  • 项目实战

基础知识

  • 基础数据类型
  • 复合数据类型
  • 控制结构
  • 函数,方法,接口

高级

  • goroutine,channel
  • 锁与条件竞争,如何进行debug
  • 包管理,单测和benchmark
  • 反射和cgo以及unsafe

项目实战

  • 使用golang编写的监控系统
  • agent采集
  • kafka传输
  • es存储,kibana展示

环境安装

https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money-back

安装

  • 下载地址(官网):https://golang.org/dl/
  • 下载地址(国内):https://dl.gocn.io/

初始化环境

  • GOROOT放置go的标准库
1
2
$HOME/local/go (Linux, mac)
c:\local\go (windows)
  • GOPATH放置第三方代码和自己的工程
1
2
$HOME/go (linux, mac)
c:\go (windows)
  • PATH
1
2
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
编译go1.4.3(需要安装gcc或者直接下载)-->编译go1.8.3(需要go1.4.3)

安装atom

编译运行

  • go build hello.go && ./hello
  • go run hello.go
1
2
3
4
GOOS=linux go build -o hello.linux hello.go
GOOS=linux go build -o hello.lin hello.go
GOOS=windows go build -o hello.exe hello.go
GOOS=darwin go build -o hello.mac hello.go

IDE选择

  • atom配合go-plus插件(课程选择)
  • sublime 配合gosublime插件
  • LiteIDE专用IDE,没用过
  • emacs+spacemacs配置(我在使用)
  • Goland JetBrains出品
1
2
3
4
5
6
gofmt -w hello.go
vi hello.go
goimports -w hello.go
go run hello.go
go install golang.org/x/tools/cmd/goimports
HTTPS_PROXY=http://192.168.1.53:20000 atom

https://github.com/icexin/sockhttp

指针

补充

画图工具

1
2
https://awwapp.com
https://sketchboard.me/

gotrace

https://github.com/divan/gotrace

homework

完善http.go和c10k.go

要求:

  1. 编译通过

  2. 编译成windows, linux和mac三个平台的文件,有条件的可以运行观察结果。二进制不用提交

分析课堂上的代码,说明原因

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func main() {
    var x int
    var y int
    x = 1
    y = 2
    swap(&x, &y)
    fmt.Println("x=", x, "y=", y)
}

func swap(p *int, q *int) {
    var t int
    t = *p
    *p = *q
    *q = t
}