1. 安裝go in linux
# yum install go -y
#[root@fc30-hadoop go]# which go
/usr/bin/go
#[root@fc30-hadoop go]# go version
go version go1.12.13 linux/amd64
[root@fc30-hadoop go]#
1.1 go 環境變量
[root@fc30-hadoop go]# go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/root/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/lib/golang"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/golang/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build130025366=/tmp/go-build -gno-record-gcc-switches"
2. golang helloworld 版本說明
[root@fc30-hadoop go]# cat helloworld.go
package main
import "fmt"
import "time"
func main() {
//2006-01-02 15:04:05是go的誕生時間,所以這麼設計Format的Layout,任何更改都不行
var currtime = time.Now().Format("2006-01-02 15:04:05 Mon")
fmt.Print("Today is:",currtime,"\n")
fmt.Println("Hello, World!")
}
說明如下:
第一行代碼 package main 定義了包名。你必須在源文件中非註釋的第一行指明這個文件屬於哪個包,如:package main。package main表示一個可獨立執行的程序,每個 Go 應用程序都包含一個名爲 main 的包
下一行 import "fmt" 告訴 Go 編譯器這個程序需要使用 fmt 包(的函數,或其他元素),fmt 包實現了格式化 IO(輸入/輸出)的函數。
func main() 是程序開始執行的函數。main 函數是每一個可執行程序所必須包含的,一般來說都是在啓動後第一個執行的函數(如果有 init() 函數則會先執行該函數)。
當標識符(包括常量、變量、類型、函數名、結構字段等等)以一個大寫字母開頭,如:Group1,那麼使用這種形式的標識符的對象就可以被外部包的代碼所使用(客戶端程序需要先導入這個包),這被稱爲導出(像java/c++中的 public);標識符如果以小寫字母開頭,則對包外是不可見的,但在整個包的內部是可見並且可用的(像java/c++中的 protected )。
###引用包要放在聲明之前
###下面寫法會報編譯錯誤
package main
type Empty struct {}
import "fmt"
# command-line-arguments
./set.go:3:1: syntax error: non-declaration statement outside function body
修正後的可以如下:
package main
import "fmt"
type Empty struct {}
3. 執行go程序
3.1 類似於腳本語言運行 類似於java/python
#go run helloworld.go
Hello, World!
3.2 編譯成目標語言運行,類似於c/c++
[root@fc30-hadoop go]# go build helloworld.go
[root@fc30-hadoop go]# ls
helloworld helloworld.go
[root@fc30-hadoop go]# ./helloworld
Hello, World!
[root@fc30-hadoop go]# ll
total 3908
-rwxr-xr-x. 1 root root 1997284 Dec 2 21:25 helloworld
-rw-r--r--. 1 root root 77 Dec 2 17:57 helloworld.go
[root@fc30-hadoop go]# ./helloworld
Hello, World!
3.3 ##go install error
install compile and install packages and dependencies
install 後接文件夾名稱
[root@fc30-hadoop week1]# go install routin
can't load package: package routin: cannot find package "routin" in any of:
/usr/lib/golang/src/routin (from $GOROOT)
/root/go/src/routin (from $GOPATH)
3.4 ###go build error
build compile packages and dependencies
編譯後的目標文件位於當前目錄
[root@fc30-hadoop week1]# go build routin
can't load package: package routin: cannot find package "routin" in any of:
/usr/lib/golang/src/routin (from $GOROOT)
/root/go/src/routin (from $GOPATH)
4. go 時間程序
引入其他時間包 time 操作系統包os
package main
import "fmt"
import "time"
import "os"
func hostinformation() {
fmt.Println(os.Hostname())
}
func main() {
//:= 短變量聲明
start := time.Now().UnixNano()
hostinformation()
end := time.Now().UnixNano()
//測試hostinformation運行時間
fmt.Printf("cost is :%d \n", ( end-start)/1000)
}
5.go 併發執行
go function( 參數1 參數2 ... 參數n) 會啓動一個輕量級線程 goroutine來啓動task,線程之間共享地址空間。
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 10; i++ {
time.Sleep(100*time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("I Love")
say("China")
}
運行結果如下:
[root@fc30-hadoop week1]# ./routin
I Love
China
China
I Love
I Love
China
China
I Love
I Love
China
China
I Love
I Love
China
China
I Love
I Love
China
China
其實從運行結果來看是不能使用的程序,雖然做到了併發,但輸出結果並無意義。