Go語言學習筆記(一)Let's 幹吧

加 Golang學習 QQ羣共同窗習進步成家立業工做 ^-^ 羣號:96933959html

簡介

    Go是Google開發的一種 靜態強類型、編譯型,併發型,並具備垃圾回收功能的編程語言。爲了方便搜索和識別,有時會將其稱爲Golang。linux

    羅伯特·格瑞史莫,羅勃·派克(Rob Pike)及肯·湯普遜於2007年9月開始設計Go語言,稍後Ian Lance Taylor、Russ Cox加入項目。Go語言是基於Inferno操做系統所開發的。Go語言於2009年11月正式宣佈推出,成爲開放源代碼項目,並在Linux及Mac OS X平臺上進行了實現,後來追加了Windows系統下的實現。在2012年早些時候發佈了Go 1穩定版本。golang

    如今Go的開發已是徹底開放的,而且擁有一個活躍的社區。編程

 

    Go語言的語法接近C語言,但對於變量的聲明有所不一樣。Go語言支持垃圾回收功能。Go語言的並行模型是以東尼·霍爾的通訊順序進程(CSP)爲基礎,採起相似模型的其餘語言包括Occam和Limbo,但它也具備Pi運算的特徵,好比通道傳輸。在1.8版本中開放插件(Plugin)的支持,這意味着如今能從Go語言中動態加載部分函數。windows

    與C++相比,Go語言並不包括如異常處理、繼承、泛型、斷言、虛函數等功能,但增長了 Slice 型、併發、管道、垃圾回收、接口(Interface)等特性的語言級支持。Google 目前仍正在討論是否應該支持泛型,其態度仍是很開放的,但在該語言的常見問題列表中,對於斷言的存在,則持負面態度,同時也爲本身不提供類型繼承來辯護。後端

    不一樣於Java,Go語言內嵌了關聯數組(也稱爲哈希表(Hashes)或字典(Dictionaries)),就像字符串類型同樣。數組

 

語言特性

1. 垃圾回收

  1. 內存自動回收,不再須要開發人員管理內存 
  2. 只須要new分配內存,不須要釋放網絡

2. 自然併發

  1. 從語言層面支持併發,很是簡單
  2. Goroutine,輕量級線程,建立成千上萬個Goroutine成爲可能架構

  3. 基於CSP(Communicating Sequential Process)模型實現併發

3. channel

  1. 管道,相似unix/linux中的pipe
  2. 多個Goroutine之間經過channel進行通訊

  3. 支持任何類型

  4. close 內置函數用來關閉 channel

4. Goroutine

    Go語言的主要的功能在於使人簡易使用的並行設計,這個方法叫作Goroutine,經過Goroutine可以讓你的程序以異步的方式運行,而不須要擔憂一個函數致使程序中斷,所以Go語言也很是地適合網絡服務。

    Goroutine是相似線程的概念(但Goroutine並非線程)。線程屬於系統層面,一般來講建立一個新的線程會消耗較多的資源且管理不易。而 Goroutine就像輕量級的線程,但咱們稱其爲併發,一個Go程序能夠運行超過數萬個 Goroutine,而且這些性能都是原生級的,隨時都可以關閉、結束。一個核內心面能夠有多個Goroutine,經過GOMAXPROCS參數你可以限制Gorotuine能夠佔用幾個系統線程來避免失控。

    在內置的官方包中也不時可以看見Goroutine的應用,像是net/http中用來監聽網絡服務的函數其實是建立一個不斷運行循環的Goroutine。

 

編譯器

    當前有兩個Go語言的編譯器的分支。官方編譯器gc和gccgo。官方編譯器在初期使用C寫成,後用go重寫從而實現自舉。Gccgo是一個使用標準GCC做爲後端的Go編譯器。

    官方編譯器支持跨平臺編譯(但不支持CGO),容許將源碼編譯爲可在目標系統、架構上執行的二進制文件。

 

安裝

下載地址:https://golang.org/dl/

設置環境變量:

  1. export GOROOT=$PATH:/path/to/go/
  2. export PATH=$PATH:$GOROOT/bin/
  3. export GOPATH=/home/user/project/go

終端測試:

  1. go version
  2. go env
  3. Gofmt -w *.go

IDE安裝可參考:

  1. http://www.cnblogs.com/zsy/archive/2016/02/28/5223957.html

 

go 標準命令

go build

go build 命令用於編譯咱們指定的源碼文件或代碼包以及它們的依賴包

go build -o bin/tongbupan go_dev/tongbupan/main
  -o :指定編譯後存放目錄以及名稱

go install

go install用於編譯並安裝指定的代碼包及它們的依賴包。

go get

go get能夠根據要求和實際狀況從互聯網上下載或更新指定的代碼包及其依賴包,並對它們進行編譯和安裝。

go clean

go clean命令會刪除掉執行其它命令時產生的一些文件和目錄

go doc & godoc

go doc命令能夠打印附於Go語言程序實體上的文檔。咱們能夠經過把程序實體的標識符做爲該命令的參數來達到查看其文檔的目的。

godoc是一個很強大的工具,一樣用於展現指定代碼包的文檔。

go run

go run命令能夠編譯並運行命令源碼文件。

go run src/go_dev/hello.go
標記名稱 標記描述
-a 強行對全部涉及到的代碼包(包含標準庫中的代碼包)進行從新構建,即便它們已是最新的了。
-n 打印編譯期間所用到的其它命令,可是並不真正執行它們。
-p n 指定編譯過程當中執行各任務的並行數量(確切地說應該是併發數量)。在默認狀況下,該數量等於CPU的邏輯核數。可是在darwin/arm平臺(即iPhone和iPad所用的平臺)下,該數量默認是1
-race 開啓競態條件的檢測。不過此標記目前僅在linux/amd64freebsd/amd64darwin/amd64windows/amd64平臺下受到支持。
-v 打印出那些被編譯的代碼包的名字。
-work 打印出編譯時生成的臨時工做目錄的路徑,並在編譯結束時保留它。在默認狀況下,編譯結束時會刪除該目錄。
-x 打印編譯期間所用到的其它命令。注意它與-n標記的區別。

go test

go test命令用於對Go語言編寫的程序進行測試。這種測試是以代碼包爲單位的。

go list

go list命令的做用是列出指定的代碼包的信息。

go fix與go tool fix

go fix會把指定代碼包的全部Go語言源碼文件中的舊版本代碼修正爲新版本的代碼。

命令go fix實際上是命令go tool fix的簡單封裝。

go vet與go tool vet

go vet是一個用於檢查Go語言源碼中靜態錯誤的簡單工具。

go vet命令是go tool vet命令的簡單封裝。

go tool pprof

go tool pprof命令來交互式的訪問概要文件的內容。

go tool cgo

可使咱們建立可以調用C語言代碼的Go語言源碼文件。

go env

go env用於打印Go語言的環境信息。

名稱 說明
CGO_ENABLED 指明cgo工具是否可用的標識。
GOARCH 程序構建環境的目標計算架構。
GOBIN 存放可執行文件的目錄的絕對路徑。
GOCHAR 程序構建環境的目標計算架構的單字符標識。
GOEXE 可執行文件的後綴。
GOHOSTARCH 程序運行環境的目標計算架構。
GOOS 程序構建環境的目標操做系統。
GOHOSTOS 程序運行環境的目標操做系統。
GOPATH 工做區目錄的絕對路徑。
GORACE 用於數據競爭檢測的相關選項。
GOROOT Go語言的安裝目錄的絕對路徑。
GOTOOLDIR Go工具目錄的絕對路徑。

 

 

Hello World 

package main

import "fmt"

func main() {
    fmt.Println("Hello World")
}

  

程序基本語法

  1. 全部go源碼以.go結尾;
  2. 註釋不會被編譯,單行註釋是以 // 開頭,多行註釋以 /* 開頭,以 */ 結尾;
  3. 標識符以字母或下劃線開頭,大小寫敏感,_ 是特殊標識符,用來忽略結果;
  4. 保留關鍵字:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
append bool byte cap close complex complex64 complex128 uint16
copy false float32 float64 imag int int8 int16 uint32
int32 int64 iota len make new nil panic uint64
print println real recover string true uint uint8 uintptr

 

 

程序基本結構

1. 任何一個代碼文件隸屬於一個包

2. golang可執行程序,package main,而且有且只有一個main入口函數

3. 包中函數調用:

  1. 同一個包中函數,直接調用
  2. 不一樣包中函數,經過包名+點+函數名進行調用

4. 包訪問控制規則:

  1. 大寫意味着這個函數/變量是可導出的
  2. 小寫意味着這個函數/變量是私有的,包外部不能訪問

 

項目目錄

$ tree project
project
├── bin
│   ├── example1
│   └── goroute_example
├── pkg
├── src
│   └── go_dev
│       └── day1
│           ├── example1
│           │   ├── debug
│           │   └── hello.go
│           └── goroute_example
│               ├── goroute
│               │   └── add.go
│               └── main
│                   └── main.go
└── vender

Src 源碼文件
Bin 編譯後二進制文件
vender  第三方
pkg 靜態文件

 

簡單栗子

$ tree project
project
├── bin
│   └── goroute_example
├── pkg
├── src
│   └── go_dev
│       └── test1
│           └── goroute_example
│               ├── goroute
│               │   └── add.go
│               └── main
│                   └── main.go
└── vender
[main.go]

package main

import (
    "fmt"
    "go_dev/test1/goroute_example/goroute"
)

func main() {
    pipe := make(chan int, 1)
    go goroute.Add(pipe, 10, 20)

    sum := <-pipe
    fmt.Println(sum)
}
[add.go]

package goroute

func Add(pipe chan int, a int, b int) {
    pipe <- (a + b)
}
$ go build -o bin/goroute_example go_dev/test1/goroute_example/main
$ bin/goroute_example 
30
$
相關文章
相關標籤/搜索