目录
1、golang简介
google于2009年推出的系统编程语言
特点:
静态编译,没有依赖
垃圾回收
简洁的符号和语法
平坦的类型系统
基于CSP的并发模型,充分利用多核
高效简单的工具链
丰富的标准库
hello world:
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
web编程:
package main
import (
"fmt"
"net/http"
)
#w http.ResponseWriter左边是参数名字,右边是类型;*是指针
func handler(w http.ResponseWriter,r *http.Request) {
fmt.Fprintf(w,"Hello world!")
#Fprintf意思是把"Hello world!"写到w对象
}
func main() {
http.HandleFunc("/",handler)
http.ListenAndServe(":8080",nil)
}
C10K问题:
func handle(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)
}
go handle(conn) #开启协程,并发
}
}
并行和并发:
并发(concurrent)不是并行(parallel):node.js具有并发的能力,但不能充分利用多核(并行)
写出一个能充分利用多核的程序需要很深的系统编程积淀
得益于优秀的设计,go可以轻松地写出跑满所有cpu的程序
python多线程是伪线程(受一个全局锁限制),不能利用多核
python多进程呢?
python的协程呢?
2、安装
软件包:
go1.10.1.windows-amd64.zip win
go1.10.1.darwin-amd64.tar.gz OS
配置环境变量:
GOROOT放置go的标准库和工具链
$HOME/local/go (linux,mac)
c:\local\go (win)
GOPATH放置第三方代码和自己的工程
$HOME/go (linux,mac)
c:\go (win)
PATH
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
vim hello.go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
go run hello.go #会打印出hello world
go build hello.go #会生成一个hello.exe可执行文件,在cmd下执行,和go run的效果一样
linux或者mac上,可以执行:
GOOS=darwin go build -o hello.mac hello.go
GOOS=windows go build -o hello.exe hello.go
GOOS=linux go build -o hello.linux hello.go
windows上:
C:\go>set GOOS=windows
C:\go>go build hello.go #设置环境变量,然后编译
安装atom
安装插件go-plus
gofmt -w hello.go #将代码格式化
手动安装工具:
goimports -w hello.go #自动引用包,需要额外安装
cd $GOPATH && mkdir -p src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/tools.git #可以去github上下载,然后解压,并重命名为tools
go install golang.org/x/tools/cmd/goimports #在GOPATH/bin目录下生成了goimports的可执行文件
利用atom自动安装,安装go-plus自动安装,但是要FQ!同时依赖git客户端
因此会提示:
$ go get -u golang.org/x/tools/cmd/goimports
$ go get -u golang.org/x/tools/cmd/gorename
$ go get -u github.com/sqs/goreturns
$ go get -u github.com/nsf/gocode
$ go get -u github.com/alecthomas/gometalinter
$ go get -u github.com/zmb3/gogetdoc
$ go get -u github.com/zmb3/goaddimport
$ go get -u github.com/rogpeppe/godef
$ go get -u golang.org/x/tools/cmd/guru
$ go get -u github.com/fatih/gomodifytags
$ go get -u github.com/tpng/gopkgs
从github上将上面的diamante下载下来,除了x/tools相关工具,解压到$GOPATH/src/github.com对应目录下,并重命名
然后手动用go install ...安装,重启atom,ok
GOPATH目录结构:
bin #编译生成的可执行文件
pkg #
src #源码,全局唯一
github.com #放置github的项目
继续下面就是用户名
最后就是项目名
#依赖git命令,-d参数是只下载不安装,-u是通过网络更新软件及其依赖
go get : Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.
go get -d github.com/51reboot/golang-01-homework
cd $GOPATH/src/github.com/51reboot/golang-01-homework
常用工具:
编译: go build
测试: go test
下载更新依赖并编译: go get
自动文档工具: godoc -http=:9090,然后访问本地9090端口
在线查看文档: godoc.org/github.com/golang/protobuf/proto
3、指针
package main
import "fmt"
func main() {
var x int
x = 1
var y int
y = 3
var p *int //*是指针的意思
p = &x //&是取地址的意思,p的值是存储x的地址
fmt.Println("p=", p)
fmt.Println("*p=", *p) //*是取p指针指向的值
fmt.Println("x=", x)
*p = 2
fmt.Println(x)
p = &y
fmt.Println("*p=",*p)
}
指针是操纵变量的变量。
直接传变量,内容太大
需要一个通用的变量能修改一类变量
语法:
*T即为类型T的指针,T可以是任何类型、包括指针类型
&t即为取变量t的地址,指针本来指向的就是内存中一块地址,是一串数字,但是编译器不允许随便指定指针为一串数字
*p即为取指针变量所执行的内容
package main
import "fmt"
func main() {
var x int
x = 1
add(x)
fmt.Println("x=",x)
addpointer(x)
fmt.Println("x=",x)
}
func add(q int) { //将x赋值给p变量
q = q + 1 //p变量值是2,但是x变量还是1,python中也一样,不过没有下面的用法
}
func addpointer(r *int) { //r是指针,指向x变量
r = *r + 1 //r指向(r指向的值+1)
}
Go中变量就是内存中的一块地址存储的内容,指针是指向此地址的变量
Python中传参就没有传入指针的说法了。
4、gotrace
https://github.com/divan/gotrace
有疑问加站长微信联系(非本文作者)