01-golang简介

jiangmf · · 1004 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

目录

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


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:jiangmf

查看原文:01-golang简介

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1004 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传