01-golang简介

栏目: Go · 发布时间: 5年前

内容简介:目录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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入浅出Tapestry

深入浅出Tapestry

董黎伟 / 电子工业出版社 / 2007-3 / 49.0

本书以循序渐进的方式,从Tapestry框架技术的基本概念入手,讲解Tapestry框架在J2EE Web应用程序中的整体架构实现。使读者在学习如何使用Tapestry框架技术的同时,还能够获得在J2EE Web应用程序中应用Tapestry框架的先进经验。 本书详细介绍了Hivemind框架的原理与应用,使读者不但可以通过Hivemind来重构Tapestry的官方实现,还可以使用Hive......一起来看看 《深入浅出Tapestry》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具