1. 程式人生 > >服務計算(2):go環境配置與學習

服務計算(2):go環境配置與學習

Go語言學習

環境配置

使用yum install

使用命令sudo yum install -y golang

直接下載安裝包

環境:騰訊雲主機 Ubuntu 16.04

具體見官方文件

  • 首先下載安裝包:wget https://studygolang.com/dl/golang/go1.11.linux-amd64.tar.gz(請自行選擇要下載的安裝包)
  • linux可以選擇直接解壓到/usr/local中,sudo tar -C /usr/local -xzf go1.11.linux-amd64.tar.gz,會在目標目錄建立一個go的檔案樹,安裝完成一半
  • 配置環境變數export PATH=$PATH:/usr/local/go/bin
    (也可以選擇安裝在其他地方,只要環境變數配置正確都可以執行)
  • 因為我用的是vim,所以安裝就到此為止了。

驗證安裝是否成功

在預設工作區(linux下為~/go)下建立/src/hello,並寫下下面程式碼:

package main

import "fmt"

func main() {
	fmt.Printf("hello, world\n")
}

然後嘗試編譯go build,如果沒有錯誤資訊,嘗試執行./hello。如果看到hello,world,則安裝成功。 如果想要改變工作區位置,看這裡

與遠端庫關聯

  1. 首先檢視使用者主目錄下是否存在.ssh目錄。沒有的話,使用命令ssh-keygen -t rsa -C "
    [email protected]
    "
    來建立SSH Key,然後將.ssh目錄下的id_rsa.pub檔案裡的公約複製,在Github介面Settings的SSH and GPG Keys介面下,點選SSH Keys上的Add new並貼上,取個Title,再確定。
  2. 使用git init建立本地倉庫,然後使用git remote add origin [email protected]:wtysos11/sysu-goLearning.git完成遠端庫關聯。
  3. 使用git commit提交第一次操作,然後使用git push origin -u master把主分支提交上遠端庫。

官方教程

讀書記錄

Cloud Native Go : 構建基於Go和React的雲原生Web應用與微服務的讀書記錄,方便日後複習

1.雲之道

cloud native:明確地關注應用而不是人和設計哲學,並且依賴於原始的“12要素法則”來定義和描繪應用程式。

雲之道的優點

雲之道改變了程式設計師對於軟體開發的看法,把他們從重複新增功能、部署並祈禱其正常執行的艱難時刻中解脫出來,使軟體開發再次成為樂趣。

規則:

  • 遵循簡單。質疑一切事物似乎違背簡單性,如無必要,不應額外新增新的複雜流程;質疑每個工具是否必要;質疑所有的程式碼是否過於複雜以至於無法閱讀。
  • 測試優先,測試一切。測試提供信心,信心戰勝對未知的恐懼;使用單元測試可以讓信心指數上升。
  • 儘早釋出,頻繁釋出。將每次程式碼提交都當作潛在的生產釋出,並通過持續交付流水線進行部署。
  • 自動化一切。任何每天做的超過一次的事情,都適合自動化;流程中任何時常重複的部分,如果不能被按鈕或指令碼所取代,那麼就屬於複雜、脆弱或兩者兼有之的部分。
  • 建立服務生態系統。任何事物都是服務,包括應用。(微服務遵循了單一責任原則SRP,即源於面向物件的設計模式,一個服務只負責一個功能)

使用GO的原因:

  1. 簡單
  2. 開源
  3. 易於自動化和IDE自動化

2.開始

配置環境

Mac需要安裝Homebrew。 安裝Mercurial和Bazaar(第三方Go包的來源,這兩個都是版本控制系統)

實操記錄:我在使用騰訊雲提供的Ubuntu14.04LTS通過sudo apt-get install bazaar安裝bazaar時反饋沒有這個包,根據官方的說明,應該使用apt-get install bzr命令進行安裝。 Mercurial的關聯命令是hg,bazaar的關聯命令是bzr。

可以通過go get命令從github上獲取程式碼。

3.Go入門

使用基本函式

GO並不是面向物件的語言,GO中沒有類,只有函式,這些函式的可見性由包的範圍以及函式是否可以匯出決定。 Go中可以實現完全的柯里化(把接受多個引數的函式變為接受一個引數的函式,並且返回接受其他引數和返回結果的新函式)

使用結構體

GO中的結構體只是欄位的型別化集合,可以巢狀使用,也可以建立匿名結構體。 從type關鍵字開始,例如

type person struct{
	name string
	age int
}

可以使用不同的方式建立結構體,下面的程式碼都可以用來建立一個person結構體

var p = person{}
var p2 =  person{"bob",21}
var p3 = person{name:"bob",age:21,}

或者在person前加&也是可以的,會建立一個指向person結構體的指標。 第一行表示如何建立一個空的結構體,第二行表示通過定義欄位的順序使我們可以順序地賦初始值。第三行允許我們以任何我們喜歡的順序為欄位賦值,因為它標明瞭欄位的名稱(類似於python)

介紹Go介面

向結構體新增方法

可以使用結構體(實際上幾乎是任何型別)來錨定方法,這意味著可以擁有專門用於結構體的函式。

注意:如果名稱與資料型別匹配,則不必重複宣告兩次,比如這樣:

type attacker struct{
	attackpower int
	dmgbonous int
}
type sword struct{
	attacker
	twohanded bool
}

下面使用Go的語法來為結構體新增Wield方法

func (s sword) Wield() bool{
	fmt.Println("You've wielded a sword!")
	return true
}
Go中的介面動態型別檢查

可以使用以下的簡單程式碼宣告一個指示某物是武器的介面:

type weapon interface {
	Wield() bool
}

與其他語言不同的是,go中不必去宣告一個結構體或者其他型別是一個武器,它能夠憑藉Go是否能夠在一定範圍內找到指定簽名的方式自動被識別。 現在可以建立下面的函式:

func wielder (w weawpon) bool{
	fmt.Println("Wielding ...")
	return w.Wield()
}

現在就可以把sword變數傳給wielder函數了。 因此只要型別滿足一個介面,它就可以在任何使用該介面的地方使用。(大概就是我要一個修空調的人,不管是空調師傅還是物業阿姨,只要能修都是可以的)

建立自有包

匯出函式和資料

軟體包是Go中的一個訪問範圍單位,雖然沒有OOP中的成員訪問關鍵字,但是仍然可以控制程式碼的可見性。我們在Go中建立的任何以小寫字母開頭的型別(或函式)都被認為是包所私有的或者沒有匯出的。我們建立的任何以大寫字母開頭的型別都會被匯出,任何使用該包的人都可以看到。

建立包

首先建立如下沒有的目錄$GOPATH/src/github.com/cloudnativego/go-primer/npcs,這意味著將在這個目錄下工作。 按照慣例,許多軟體開發人員更喜歡建立一個types.go檔案,其中包含要由軟體包使用或匯出的型別,例如以下這個。

package npcs

// Power describes the attack and defense power of the NPC
type Power struct {
	Attack int
	Defense int
}

// Location describes where in the virtual world an NPC exists
type Location struct {
	X float64
	Y float64
	Z float64
}

// NonPlayerCharacter represents metadata for an in-game creature
type NonPlayerCharacter struct{
	Name string
	Speed int
	HP int
	Power Power
	Loc Location
}

所有向包使用者暴露的方法會放在一個名為npcs.go的單獨檔案中:

package npcs

import (
	"fmt"
	"math"
)

func (loc Location) String() string{
	return fmt.Sprintf("(%f,%f,%f)",loc.X,loc.Y,loc.Z)
}
...

所有的匯出函式都需要以大寫字母開頭,同時它們所操作的結構體和欄位也已經被匯出了。 建立完這個子包之後,就可以在客戶端應用程式中使用它了。