Go 入門

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

其實從運行結果來看是不能使用的程序,雖然做到了併發,但輸出結果並無意義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章