golang 入門

緣起

以前下載視頻用的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個播主,上傳了幾百個經典香港電影 :
經典香港電影
東方不敗影院php

$ 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 格式,大小560Mhtml

$ 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 加入環境變量python

λ  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,沒有其餘依賴,只要把這個文件下載就能用,太方便了,因而開始學習下 golanggit

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調用的 函數 中有效github

而後熟悉語法,說到這個,簡直奇葩,跟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'
這裏要說下字符和字符串類型 ,字符是單個字符,用單引號,字符串是多個字符組成,用雙引號,不能混用, 這的奇葩語法。golang

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{json

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\n",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/最後,學習之路,路漫漫其修遠兮。

相關文章
相關標籤/搜索