内容简介:目录google于2009年推出的系统编程语言特点:
目录
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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。