01-golang简介

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

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


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

查看所有标签

猜你喜欢:

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

Is Parallel Programming Hard, And, If So, What Can You Do About

Is Parallel Programming Hard, And, If So, What Can You Do About

Paul E. McKenney

The purpose of this book is to help you understand how to program shared-memory parallel machines without risking your sanity.1 By describing the algorithms and designs that have worked well in the pa......一起来看看 《Is Parallel Programming Hard, And, If So, What Can You Do About 》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

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

在线 XML 格式化压缩工具