服務計算(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
,則安裝成功。
如果想要改變工作區位置,看這裡。
與遠端庫關聯
- 首先檢視使用者主目錄下是否存在.ssh目錄。沒有的話,使用命令
ssh-keygen -t rsa -C "
來建立SSH Key,然後將.ssh目錄下的id_rsa.pub檔案裡的公約複製,在Github介面Settings的SSH and GPG Keys介面下,點選SSH Keys上的Add new並貼上,取個Title,再確定。 - 使用
git init
建立本地倉庫,然後使用git remote add origin [email protected]:wtysos11/sysu-goLearning.git
完成遠端庫關聯。 - 使用
git commit
提交第一次操作,然後使用git push origin -u master
把主分支提交上遠端庫。
官方教程
讀書記錄
Cloud Native Go : 構建基於Go和React的雲原生Web應用與微服務的讀書記錄,方便日後複習
1.雲之道
cloud native:明確地關注應用而不是人和設計哲學,並且依賴於原始的“12要素法則”來定義和描繪應用程式。
雲之道的優點
雲之道改變了程式設計師對於軟體開發的看法,把他們從重複新增功能、部署並祈禱其正常執行的艱難時刻中解脫出來,使軟體開發再次成為樂趣。
規則:
- 遵循簡單。質疑一切事物似乎違背簡單性,如無必要,不應額外新增新的複雜流程;質疑每個工具是否必要;質疑所有的程式碼是否過於複雜以至於無法閱讀。
- 測試優先,測試一切。測試提供信心,信心戰勝對未知的恐懼;使用單元測試可以讓信心指數上升。
- 儘早釋出,頻繁釋出。將每次程式碼提交都當作潛在的生產釋出,並通過持續交付流水線進行部署。
- 自動化一切。任何每天做的超過一次的事情,都適合自動化;流程中任何時常重複的部分,如果不能被按鈕或指令碼所取代,那麼就屬於複雜、脆弱或兩者兼有之的部分。
- 建立服務生態系統。任何事物都是服務,包括應用。(微服務遵循了單一責任原則SRP,即源於面向物件的設計模式,一個服務只負責一個功能)
使用GO的原因:
- 簡單
- 開源
- 易於自動化和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)
}
...
所有的匯出函式都需要以大寫字母開頭,同時它們所操作的結構體和欄位也已經被匯出了。 建立完這個子包之後,就可以在客戶端應用程式中使用它了。