golang 入門

Dream發表於2019-02-16

緣起

之前下載視訊用的you-get,但是b站一直下不了,優酷也經常出問題,所以接觸到lulu https://github.com/iawia002/Lulu 這個也是基於you-get 直接 pip install lulu,但是作者不維護了,新出了個 https://github.com/iawia002/a… 這個不是python 開發的 ,而是 go ,通過 go get github.com/iawia002/annie 來安裝 ,比如之前用lulu下載電影優酷的《大話西遊》,這裡推薦下優酷的2個播主,上傳了幾百個經典香港電影 :
經典香港電影
東方不敗影院

$ lulu -i https://v.youku.com/v_show/id_XMzY4OTMxMTYyMA==.html?
It seems that your ffmpeg is a nightly build.
Please switch to the latest stable if merging failed.
site:                優酷 (Youku)
title:               大話西遊之大聖娶親【周星馳】【1080p】【國語中字】
streams:             # Available quality and codecs
    [ DEFAULT ] _________________________________
    - format:        mp4hd3v2
      container:     mp4
      video-profile: 1080P
      size:          1777.4 MiB (1863787718 bytes)
      m3u8_url:      http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=mp4hd3v3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5983&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=5310a4e7d0e7795209d27a8b117c8a04
    # download-with: lulu --format=mp4hd3v2 [URL]

    - format:        mp4hd2v2
      container:     mp4
      video-profile: 超清
      size:          906.9 MiB (950999892 bytes)
      m3u8_url:      http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=mp4hd2v3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5983&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=5310a4e7d0e7795209d27a8b117c8a04
    # download-with: lulu --format=mp4hd2v2 [URL]

    - format:        mp4hd
      container:     mp4
      video-profile: 高清
      size:          560.3 MiB (587487098 bytes)
      m3u8_url:      http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=mp4hdv3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5983&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=5310a4e7d0e7795209d27a8b117c8a04
    # download-with: lulu --format=mp4hd [URL]

    - format:        3gphd
      container:     mp4
      video-profile: 渣清
      size:          184.1 MiB (193030164 bytes)
      m3u8_url:      http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=3gphdv3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5984&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=e8361d25bb6ea3bb70a8a81a94ed5b50
    # download-with: lulu --format=3gphd [URL]

    - format:        mp4sd
      container:     mp4
      video-profile: 標清
      size:          279.0 MiB (292555710 bytes)
      m3u8_url:      http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=flvhdv3&ups_client_netip=756495b7&utid=31o%2FFP58k0kCAXVklbeqyp8h&ccode=0502&psid=f9aac3a8a0c035a6baa3a745a49c2487&duration=5984&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813154&onOff=0&encr=0&ups_key=e8361d25bb6ea3bb70a8a81a94ed5b50
    # download-with: lulu --format=mp4sd [URL]

開始下載mp4hd 格式,大小560M

$ lulu --format=mp4hd https://v.youku.com/v_show/id_XMzY4OTMxMTYyMA==.html?
It seems that your ffmpeg is a nightly build.
Please switch to the latest stable if merging failed.
site:                優酷 (Youku)
title:               大話西遊之大聖娶親【周星馳】【1080p】【國語中字】
stream:
    - format:        mp4hd
      container:     mp4
      video-profile: 高清
      size:          560.3 MiB (587487098 bytes)
      m3u8_url:      http://pl-ali.youku.com/playlist/m3u8?vid=XMzY4OTMxMTYyMA&type=mp4hdv3&ups_client_netip=756495b7&utid=OVs%2FFCNJrjgCAXVklbfwfTTy&ccode=0502&psid=d311f534cb94393bef9139f8653f6a20&duration=5983&expire=18000&drm_type=1&drm_device=7&ups_ts=1538813244&onOff=0&encr=0&ups_key=328b76a03e2f827a1465b0428813b011
    # download-with: lulu --format=mp4hd [URL]

Downloading 大話西遊之大聖娶親【周星馳】【1080p】【國語中字】.mp4 ...
 0.2% (  1.4/560.3MB) ├──────────────────────────────────────┤[ 1/16]    0  B/sl 100% (560.3/560.3MB) ├██████████████████████████████████████┤[16/16]  372 kB/s
Merging video parts...

其實就是用ffmpeg下載m3u8檔案,但是也經常出問題
$ lulu -i https://v.youku.com/v_show/id_XMzY4OTMxMTYyMA==.html
lulu: ▒ͻ▒▒▒▒▒Ȩ▒▒▒▒,201
It seems that your ffmpeg is a nightly build.
Please switch to the latest stable if merging failed.

然後用annie 看看 ,注意先把bin 加入環境變數

λ  annie  -i  https://v.youku.com/v_show/id_XMzY4OTMxMTYyMA==.html

 Site:      優酷 youku.com
 Title:     大話西遊之大聖娶親【周星馳】【1080p】【國語中字】
 Type:      video
 Streams:   # All available quality
     [mp4hd3]  -------------------
     Quality:         mp4hd3 1920x1080
     Size:            1777.45 MiB (1863787718 Bytes)
     # download with: annie -f mp4hd3 ...

     [mp4hd2]  -------------------
     Quality:         mp4hd2 1280x720
     Size:            906.94 MiB (950999892 Bytes)
     # download with: annie -f mp4hd2 ...

     [mp4hd]  -------------------
     Quality:         mp4hd 960x540
     Size:            560.27 MiB (587487098 Bytes)
     # download with: annie -f mp4hd ...

     [flvhd]  -------------------
     Quality:         flvhd 640x360
     Size:            279.00 MiB (292555710 Bytes)
     # download with: annie -f flvhd ...

     [3gphd]  -------------------
     Quality:         3gphd 480x270
     Size:            184.09 MiB (193030164 Bytes)
     # download with: annie -f 3gphd ...

go生成的可執行檔案就一個annie.exe,沒有其他依賴,只要把這個檔案下載就能用,太方便了,於是開始學習下 golang

Go的主要特點有哪些?
-型別安全 和 記憶體安全
-以非常直觀和極低代價的方案實現 高併發
-高效的垃圾回收機制
-快速編譯(同時解決C語言中標頭檔案太多的問題)
-為多核計算機提供效能提升的方案-UTF-8編碼支援

只有 package名稱為 main的包可以包含main 函式
-一個可執行程式有且僅有 一個main 包
通過 import關鍵字來 匯入其它非 main包
使用 大小寫 來決定該 常量、 變數、型別、介面、結構或函式 是否可以被外部 包所調 用:根據約定,函式名首字母 小寫 即為pri vate
不可以用 數字代表true或false
其它值 型別:- array、struct、string
-引用型別:- slice、map、chan
-介面型別:inteface
-函式型別:func
全域性變數的 宣告不 可以省略 var,但可使用 並行方式
區域性變 量不可以使用 var () 的方式簡寫,只能使用 並行方式
Go中不存在隱式轉換 ,所有型別轉換必須顯式宣告-轉換隻 能發 生在兩種相互相容 的型別之間
常量 表達 式中的 函式必須是內建函式
在Go當中不支援指標運 算以及 ”->”運算子,而直接採用”.”選擇符來 操作指標目標對 象的成員-操作符”&”取變數地址 ,使用 ”*”通過指標間接訪問目 標物件-預設 值為 nil 而非 NULL
陣列長度也是型別的一部分,因此具有不同長度的陣列 為不同型別
-注意區分指向陣列的指標 和指標陣列
Go 函式 不支援 巢狀、過載和預設引數
defer的執行 方式 類似其它語言中的解構函式,在函式體執行結束後按照呼叫順序的相反順序逐個執行
-即使函式發生嚴重 錯誤也會執行-支援匿名函式的呼叫-常用於資源 清理、檔案關閉、解鎖以及記 錄時間等 操作
-通過與 匿名函式配 合可在return之後修改函式 計算結果
-如果函式體內某個變數作為defer時匿名函式的引數,則在定義defer時即已 經獲得了拷貝,否則則 是引用某個變 量的 地址
-Go 沒有異常機制,但有 panic/recover 模式來處理錯誤
-Panic 可以在任何地方引發, 但reco ver只有在defer呼叫的 函式 中有效

然後熟悉語法,說到這個,簡直奇葩,跟PHP py完全不是一個套路,一個單引號 雙引號混了就失敗,先定義package ,如果不是需要執行的編譯檔案,不能為main ,比如learn/study/test.php package study
run.go import learn/study import匯入的是目錄 ,匯入的包如果不用還不行,定義變數需要指定型別 ,比如var a int =3 const b string = “abc” type long float64
var c byte=`a`
這裡要說下字元和字串型別 ,字元是單個字元,用單引號,字串是多個字元組成,用雙引號,不能混用, 這的奇葩語法。

src 存放原始碼(比如:.go .c .h .s等)
pkg 編譯後生成的檔案(比如:.a)
bin 編譯後生成的可執行檔案(為了方便,可以把此目錄加入到 $PATH 變數中,如果有多個gopath,那麼使用${GOPATH//://bin:}/bin新增所有的bin目錄)很多Go命令都依賴於此變數,例如go get命令會將獲取到的包放到GOPATH中。

如果是普通包,當你執行go build之後,它不會產生任何檔案。如果你需要在$GOPATH/pkg下生成相應的檔案,那就得執行go install了
如果是main包,當你執行go build之後,它就會在當前目錄下生成一個可執行檔案。如果你需要在$GOPATH/bin下生成相應的檔案,需要執行go install。
go build會忽略目錄下以“_”或“.”開頭的go檔案。
go install 這個命令在內部實際上分成了兩步操作:第一步是生成結果檔案(可執行檔案或者.a包),第二步會把編譯好的結果移到$GOPATH/pkg或者$GOPATH/bin。
Go語言中字串的可以使用雙引號( ” )或者反引號( ` )來建立。 一個單一的字元可以用一個單一的rune來表示
不能使用var i bool,j string = true, “hello”進行賦值
var myMap map[string]string // 字典聲名,宣告的map是空值,需要用make()建立
myMap = make(map[string]string)
// 匿名函式直接執行, 直接在函式定義後面加上引數即可
func(x,y int)int{

return x+y

}(2,3) // 傳入引數2,3執行
// 匿名函式賦值
f := func(x,y int)int{

return x+y

}
type Myint int
func (m Myint)Less(b Myint) bool{
return m < b
}
var a Myint = 1
if a.Less(2){ // 對天顯示的型別2會自動處理成相應型別

// do something

}
var v1 interface{} = …
switch v := v1.(type) {
case int:

//  v為 int

case string:

//  v為 string

//…
}
value, ok := tes[“a”].(string) // “abc”, true

len(s) 字串s中的位元組數
len([]rune(s)) 字串s中字元的個數,可以使用更快的方法utf8.RuneCountInString()
[ ]rune(s) 將字串s轉換為一個unicode值組成的串
string(chars) chars型別是[]rune或者[]int32, 將之轉換為字串
[ ]byte(s) 無副本的將字串s轉換為一個原始的位元組的切片陣列,不保證轉換的位元組是合法的UTF-8編碼位元組 &用於取地址,*用於解引用,也就是獲取指標指向的值。 陣列是一個定長的序列,其中的元素型別相同。多維陣列可以簡單地使用自身為陣列的元素來建立。 陣列是按值傳遞的(即是傳遞的副本),而切片是引用型別,傳遞切片的成本非常小,而且是不定長的。而且陣列是定長的,而切片可以調整長度。

x := int16(2345) // 宣告一個型別為int16的整數,其值為2345
y := int32(x) // 將int16型別的整數轉換為int32型別
a := uint16(6500) // 宣告一個型別為uint16型別的整數
b := int16(a) // 轉換為int16型別,雖然能轉換成功,但是由於6500超過in16型別的範圍,會導致結果錯誤,b的值為 -536
type StringsSlice []string 將[]string(string型別的切片)宣告為StringSlice型別。
interface{} 型別表示一個空介面,任何型別都滿足空介面。也就是說 interface{} 型別的值可以用於表示任意 Go 語言型別的值。
var i interface{} = 99 // 建立一個interface{}型別,其值為99

var s interface{} = []string{"left", "right"}
j := i.(int) // 我們假設i是相容int型別,並使用型別斷言將其轉換為int型別
Go 編譯器不允許宣告匯入某個包卻不使用。下劃線讓編譯器接受這類匯入,並且呼叫對應包內的所有程式碼檔案裡定義的init函式。

結構體來實現介面 通過介面呼叫 var name interface{}可表示任意型別 name=1 name.(int) name=`a` switch name.(type) 型別斷言 介面是方法的集合 go install m.go 安裝到$gobin 目錄 ,然後可以直接執行生成的檔案 go get -u github.com/tet 更新程式碼 五大受損,
main 函式是main包才定義的,而且不能手動呼叫,在init後執行,相當PHP的建構函式 ,但是沒有引數和返回值,一個簡單的demo

package main
import fm "fmt"
var d =1
const ( // 常量組
    a, b = 10, 100
    c bool = false
)
func main() {
  power := getPower()//函式內才能不用var宣告變數
  name:="test"//下面沒有用到還會失敗!!!,但是全域性變數a不會
  fm.Printf(" power is over %d
",power)
}

func getPower() int {
  return 9001
}

go run test.go
程式正常退出的程式碼為 0 即 Program exited with code 0;如果程式因為異常而被終止,則會返回非零值,如:1。這個數值可以用來測試是否成功執行一個程式。

一些常用的命令

go build 編譯並安裝自身包和依賴包,比如window生成EXE檔案
go install 安裝自身包和依賴包,安裝到pkg目錄
gofmt –w program.go 會格式化該原始檔的程式碼然後將格式化後的程式碼覆蓋原始內容, 有了這個不用擔心PHP一樣的帶風格混亂
go doc package 獲取包的文件註釋

當識別符號(包括常量、變數、型別、函式名、結構欄位等等)以一個大寫字母開頭,如:Group1,那麼使用這種形式的識別符號的物件就可以被外部包的程式碼所使用(客戶端程式需要先匯入這個包),這被稱為匯出(像面嚮物件語言中的 public);識別符號如果以小寫字母開頭,則對包外是不可見的,但是他們在整個包的內部是可見並且可用的(像面嚮物件語言中的 private )。

go居然這樣實現物件導向!!!!
break 只是退出當前的迴圈體,而 return 語句提前對函式進行返回,不會執行後續的程式碼。
package表示原始碼所屬的程式碼包 * 要生成GO語言可執行程式,必須要有main的package包,且必須在該包下有main()函式
同一路徑下只能存在一個package**,一個package可以拆分成多個原始檔組成
操作符 “&” 取變數地址,”*” 透過指標訪問目標物件,關鍵字 defer 用於註冊延遲呼叫。這些呼叫直到 return 前才被執行,還有陣列,slice 沒來得及學,真的有點難,下次再說了。

包管理工具 govendor go get -u -v github.com/kardianos/govendor govendor init govendor add +external 第三方下載包的工具: gopm, 這個工具解決的問題是: go get 一般是從 github 伺服器, 或者 google 伺服器上下載第三方庫, 所以有時候網速慢,或者下載不成功 go get -u github.com/gpmgo/gopm 再使用 gopm 下載第三方庫: gopm get -g -v ** 固定長度列表在Golang 裡稱之為陣列.

長度不固定的裡稱之為切片,值傳遞 一般獲取值: func (m MyExample) GetAttrName()string
指標傳遞一般改變值: func (m *MyExample) SetAttrAge(newAge int) 值傳遞和指標傳遞針對的是函式的傳入引數究竟是拷貝入參的值進行操作還是拷貝入參的記憶體地址,帶來的效果就是一個能改變傳入的引數的值,一個不能改變傳入引數的值。這兩個函式沒有入參和返回值
一個工程有且只有一個 main 函式作為程式的主入口
一個工程可以有多個init 函式,執行順序和包的匯入順序相關
同一資料型別的集合可以使用下面的變數宣告方式 var Infor map[string]string 單一的資料型別可以使用 變數宣告的方式var Number int 表示不同的資料型別的集合 結構體
結構體可以用來表示不同的資料型別的集合, 同時可以表示使用者自定義型別。 結構體可以當做是一種資料型別type Name struct{}
var Infor Name 一般都預設函式的最後一個返回值是 err。type InformationWithLabel struct {

Name string `json:"name"`
Age  int    `json:"age"`

} func example(arg int) (int, error) {

return arg + 1, nil

} func Errorf(format string, a …interface{}) error {

return errors.New(Sprintf(format, a...))

} 需要強制退出程式,可以使用 panic panic(nil) recover 可以接收返回的異常資訊,通常和 defer 一起使用 golang 中,使用到的包需要匯入,不使用的包匯入,編譯過程會報錯。這一點和 python 很不一樣。 即以GOPATG/src 為基本路徑匯入完整路徑即可 介面在 go 語言中是一系列方法的集合 一個結構體實現了介面要求的所有的方法(方法的引數和返回值一致),那麼就說這個結構體實現了這個介面 內建函式 new 按指定型別分配零值記憶體, 返回的是一個指標。漢字轉拼音https://github.com/mozillazg/… https://github.com/mozillazg/… .(type) 只在 switch 語句裡才能使用。空介面在 go 裡,可以當成任意型別,意味著,比如你的函式或者方法不知道傳入的引數的型別,可以直接定義為 interface{}

實踐

Go語言生成二維碼是如此簡單
go get github.com/skip2/go-qrcode 下載原始碼

vi qrcode.go
package main
import "github.com/skip2/go-qrcode"

func main() {
    qrcode.WriteFile("http://www.flysnow.org/",qrcode.Medium,256,"./blog_qrcode.png")
}

go run qrcode.go

推薦教程

文章:
learn-go-with-tests
https://studygolang.gitbook.i…
https://zhuanlan.zhihu.com/p/…
Go名庫講解https://github.com/Unknwon/go…
Go語言實戰筆記 https://zhuanlan.zhihu.com/go…
命令列 https://github.com/sbinet/igo
golang 面試題 https://zhuanlan.zhihu.com/p/… https://yushuangqi.com/blog/2…
記錄學習過程 https://zhuanlan.zhihu.com/c_…
https://github.com/chai2010/a…
https://github.com/avelino/aw…
https://github.com/golang-chi…
https://github.com/Unknwon/go…
Golang 中文學習資料 https://go.wuhaolin.cn/
https://juejin.im/entry/58bfa…
https://www.v2ex.com/t/476425…
https://golangcaff.com/
Golang做了一個命令列貪吃蛇遊戲 https://zhuanlan.zhihu.com/p/…
Golang 學習筆記一 https://zhuanlan.zhihu.com/p/…
Golang學習 https://zhuanlan.zhihu.com/p/…
《Go 學習筆記》 https://hacpai.com/article/14…
線上ide https://wide.b3log.org/login https://wide.b3log.org/playgr…
Go 標準庫中文文件http://cngolib.com/
Golang 速查表 https://wuyin.io/2018/06/11/g…
https://www.imooc.com/code/8247
https://golangcaff.com/docs/t…
有哪有優秀的golang庫? https://www.zhihu.com/questio…
官網:https://awesome-go.com/
官網:https://golanglibs.com/ https://gocn.vip/
用 Golang 來編寫 cli 程式吧 https://zhuanlan.zhihu.com/p/…
golang新手容易犯的三個錯誤 https://zhuanlan.zhihu.com/p/…
為什麼用golang作為遊戲服務端的開發語言,它的併發性如何?golang有什麼優點? https://www.zhihu.com/questio…
我們說Golang牛逼都在說些什麼? https://zhuanlan.zhihu.com/p/…
怎麼學習 Golang? https://www.zhihu.com/questio…
如何從 PHP 過渡到 Golang? https://www.zhihu.com/questio…
golang 面試題 https://zhuanlan.zhihu.com/p/…
如果你是一個Golang面試官,你會問哪些問題? https://www.zhihu.com/questio…
golang面試筆試題(第二版) https://zhuanlan.zhihu.com/p/…
總結的一些語法和 Go 特點 https://github.com/a8m/go-lan…
Golang 介紹及踩坑系列之三 https://zhuanlan.zhihu.com/p/…
為網際網路IT人打造的中文版awesome-go https://github.com/hackstoic/…
轉golang開發,需滿足哪些技能 https://www.zhihu.com/questio…
你見過哪些令你瞠目結舌的Golang程式碼技巧? https://www.zhihu.com/questio…
我的golang學習筆記 https://zhuanlan.zhihu.com/p/…
Golang 爬蟲上手指南 https://zhuanlan.zhihu.com/p/…
GoLang基礎語法 https://zhuanlan.zhihu.com/p/…
Golang 讀寫 Excel https://zhuanlan.zhihu.com/p/…
記錄我的Go語言學習歷程 https://github.com/xx19941215…
go cheatsheet https://devhints.io/go
https://github.com/wuxiaoxiao… https://github.com/wuxiaoxiao… https://github.com/wuxiaoxiaoshen/JianShu https://www.bilibili.com/vide…

視訊教程:
後端工程師攻略 https://www.bilibili.com/vide…
https://study.163.com/course/…
https://www.bilibili.com/vide…
http://edu.51cto.com/center/c…
https://www.bilibili.com/vide…
20個小時快速入門go語言 https://www.bilibili.com/vide…
go語言與區塊鏈教程輕鬆搞定Golanghttps://www.bilibili.com/vide…
Go 語言教程 【Go 程式設計基礎】 https://www.bilibili.com/vide…
Go 語言基礎實戰 https://www.bilibili.com/vide…
GO實現千萬級WebSocket訊息推送服務https://www.imooc.com/learn/1025
20小時快速入門Go語言 https://study.163.com/course/…
https://www.imooc.com/video/1…
Go語言程式設計原始碼 https://github.com/shiyanlou/…
【程式設計開發】TCP-IP基礎概述及IP地址子網劃分https://www.bilibili.com/vide…
【王道考研】資料結構 知識點+習題+綜合真題(完結) https://www.bilibili.com/vide…
Go語言Web開發Beego框架深入淺出【黑馬程式設計師出品】 https://www.bilibili.com/vide…
後端工程師攻略 — 06-回顧總結https://www.bilibili.com/vide…
http://www.52studyit.com/ http://www.maiziedu.com/
最後,學習之路,路漫漫其修遠兮。

相關文章