成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

minikube代碼分析與Go語言 - 1

vspiders / 3314人閱讀

摘要:閑言最近需要看簡寫為和相關(guān)的技術(shù)資料,順帶學(xué)一下語言。語言始于年月的三個工程師,年月正式宣布。項(xiàng)目包括語言工具和標(biāo)準(zhǔn)庫,以及一切從簡的理念。語言本身成熟且穩(wěn)定,并且保證向下兼容。

[TOC]

閑言

最近需要看Kubernetes(簡寫為k8s)和docker相關(guān)的技術(shù)資料,順帶學(xué)一下Go語言。

嘗試了通過minikube部署遇到鏡像下載和網(wǎng)絡(luò)配置等等各種問題。
雖然k8s很火熱,但是資料其實(shí)很少,并且國內(nèi)熱衷于在其上做集成或者重新造輪子,對于這些用Go實(shí)現(xiàn)的工具內(nèi)部分析討論不多。

所以趁著最近有點(diǎn)時間,邊看minikube源碼邊讀 《The Go Programming Language》,將minikube的架構(gòu)、主要流程和實(shí)現(xiàn)做一個分析,Go語言應(yīng)該也能夠?qū)W以致用,同時附帶一下k8sdocker相關(guān)知識,以及八卦。

紙上得來終覺淺
絕知此事要躬行
項(xiàng)目 版本
go v1.8.3
minikube v0.20.0
kubectl v1.7.0
Go語言簡介

Go是一門開源的編程語言,致力于開發(fā)簡單、可靠和高效的軟件。

Go語言始于2007年9月Google的三個工程師Robert Griesemer, Rob Pike, Ken Thompson,2009年11月正式宣布。

Go項(xiàng)目包括語言、工具和標(biāo)準(zhǔn)庫,以及一切從簡的理念。

作為較新的高層語言,Go有其后發(fā)優(yōu)勢:它包含了垃圾收集、包管理系統(tǒng)、函數(shù)式代碼,語義作用域,系統(tǒng)調(diào)用接口和基于UTF-8的常量字符串。

但是Go僅僅有相對較少的特性并且不太可能添加更多功能支持。
比如說Go沒有隱式數(shù)字轉(zhuǎn)換,沒有構(gòu)造和析構(gòu)函數(shù),沒有操作符重載,沒有默認(rèn)參數(shù),沒有繼承,沒有泛型,沒有異常,沒有宏,沒有函數(shù)標(biāo)注,也沒有線程本地存儲。

Go語言本身成熟且穩(wěn)定,并且保證向下兼容。

安裝最新的Go

https://golang.org/doc/install

# 刪除系統(tǒng)已經(jīng)安裝的golang
sudo apt remove golang-go

# 下載最新版本
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz

# 解壓到/usr/local/go下
sudo tar -C /usr/local -zxvf go1.8.3.linux-amd64.tar.gz

# 把go/bin加入到用戶PATH環(huán)境變量,或是系統(tǒng)范圍 /etc/profile
echo "PATH=$PATH:/usr/local/go/bin" >> $HOME/.profile

查看安裝的Go版本:

$ source ~/.profile 
$ go version
go version go1.8.3 linux/amd64
0 - Go語言設(shè)計體系
graph TD

CSP[CSP, Hoare, 1978]-->Squeak
Squeak[Squeak, Cardelli & Pike, 1985]-->Newsqueak
Newsqueak[Newsqueak, Pike, 1989]-->Alef
Alef[Alef, Winterbottom, 1992]-->Go

ALGOL-60[ALGOL 60, Bakus etal., 1960]-->Pascal
Pascal[Pascal, Wirth, 1970]-->Modula-2
Modula-2[Modula-2, Wirth, 1980]-->Oberon
Oberon[Oberon, Wirth & Gutknecht, 1986]-->Oberon-2
Oberon-->Object-Oberon
Object-Oberon[Object Oberon, Mossenbock, Templ & Griesemer, 1990]-->Oberon-2
Oberon-2[Oberon-2, Wirth & Mossenbock, 11991]-->Go

ALGOL-60-->C[C, Ritchie, 1972]
C-->Go[Go, Griesemer, Pike & Thompson, 2009]

參考材料:

計算機(jī)科學(xué)經(jīng)典論文

1 - 基礎(chǔ)結(jié)構(gòu)

go run 可以直接運(yùn)行g(shù)o代碼文件

go build 編譯代碼

go fmt 幫助格式化代碼

++helloworld.go++ (打印字符串)

// Go代碼按包組織,類似其它語言的模塊或庫
// 當(dāng)前Go有100多個包,涵蓋了輸入輸出,排序,文本處理等基本任務(wù)
package main // main包表示這是可執(zhí)行文件而不是庫代碼

import "fmt" // fmt包負(fù)責(zé)處理格式化輸入輸出

// 函數(shù)聲明是func關(guān)鍵字
func main() { // { 必須要跟代碼在同一行,不能多帶帶一行
    fmt.Println("Hello,世界!") // 默認(rèn)不用寫分號,Go會自動加上
} // Go默認(rèn)采用UTF-8編碼,兼容多種語言

++echo.go++ (回顯命令參數(shù))

package main

import ( // 導(dǎo)入多個包的常用形式
    "fmt"
    "os"
)

func main() {
    var sep = ""  // Go不允許聲明沒有用到的變量
    // range關(guān)鍵字,數(shù)組切分跟Python類似,無需括號
    for _, arg := range os.Args[1:] { // := 是聲明變量的簡寫
        sep += arg + " " // 支持逆波蘭表達(dá)式,僅支持i++形式,不支持++i
    }
    fmt.Println(sep)
}

++dup.go++ (統(tǒng)計重復(fù)行數(shù))

package main

import ( // 導(dǎo)入多個包的常用形式
    "bufio"
    "fmt"
    "os"
)

func main() {
    counts := make(map[string]int) // 內(nèi)置函數(shù)make創(chuàng)建一個新的map類型變量
    if len(os.Args) > 1 {
        for _, file := range os.Args[1:] { // 如果有參數(shù)則作為文件打開
            f, err := os.Open(file)
            if err != nil { // 錯誤值
                fmt.Fprintf(os.Stderr, "dup: %v
", err)
                continue
            } else {
                countLines(f, counts)
                f.Close()
            }
        }
    } else {
        countLines(os.Stdin, counts)
    }

    for line, num := range counts {
        if num > 1 { // 不需要`(`,但`{`還是要有
            fmt.Printf("> %d	"%s"
", num, line) // 與C語言的printf類似
        }
    }
}

// 聲明函數(shù)參數(shù)的形式,counts是引用類型
func countLines(f *os.File, counts map[string]int) {
    for input := bufio.NewScanner(f); input.Scan(); { // for可以替代while
        counts[input.Text()]++
    }
}

++gif.go++ (生成gif動態(tài)圖)

package main

// 演示Go的標(biāo)準(zhǔn)圖像包
import (
    "image"
    "image/color" // 引用包的最后一部分,如color.White
    "image/gif"
    "io"
    "math"
    "math/rand"
    "os"
)

// 一種緊湊的方式聲明復(fù)合類型,詳見第四部分
var palette = []color.Color{color.White, color.Black} // slice

// 聲明常量,相當(dāng)于給一些值起個名字
const ( // 常量只能是數(shù)字、字符串或bool值
    white = 0 // first color in palette
    black = 1 // next color in palette
)

func main() {
    lissajous(os.Stdout)
}

func lissajous(out io.Writer) {
    const (
        cycles  = 5     // number of complete x oscillator revolutions
        res     = 0.001 // angular resolution
        size    = 100   // image canvas covers [-size..+size]
        nframes = 64    // number of animation frames
        delay   = 8     // delay between frames in 10ms units
    )
    freq := rand.Float64() * 3.0        // relative frequency of y oscillator
    anim := gif.GIF{LoopCount: nframes} // struct
    phase := 0.0                        // phase difference
    for i := 0; i < nframes; i++ {
        rect := image.Rect(0, 0, 2*size+1, 2*size+1)
        img := image.NewPaletted(rect, palette)
        for t := 0.0; t < cycles*2*math.Pi; t += res {
            x := math.Sin(t)
            y := math.Sin(t*freq + phase)
            img.SetColorIndex(size+int(x*size+.5), size+int(y*size+.5), black)
        }
        phase += .1
        anim.Delay = append(anim.Delay, delay)
        anim.Image = append(anim.Image, img)
    }
    gif.EncodeAll(out, &anim)
}

++fetch.go++ (并行獲取URL內(nèi)容)

package main // main包表示這是可執(zhí)行文件而不是庫代碼
import (
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "os"
    "time"
)

func main() { // main函數(shù)運(yùn)行運(yùn)行于一個goroutine內(nèi)
    start := time.Now()
    ch := make(chan string) // channel是在goroutine間消息通信的機(jī)制

    for _, url := range os.Args[1:] {
        go fetch(url, ch) // goroutine是并行執(zhí)行的函數(shù),go語句建立goroutine
    }
    for range os.Args[1:] {
        fmt.Println(<-ch) // 消息傳遞是阻塞式的
    }
    fmt.Printf("%.2fs elapsed
", time.Since(start).Seconds())
}

func fetch(url string, ch chan<- string) {
    start := time.Now()

    resp, err := http.Get(url)
    if err != nil {
        ch <- fmt.Sprint(err)
        return
    }
    nb, err := io.Copy(ioutil.Discard, resp.Body)
    resp.Body.Close()
    if err != nil {
        ch <- fmt.Sprintf("while reading %s: %v
", url, err)
        return
    }
    secs := time.Since(start).Seconds()
    ch <- fmt.Sprintf("%.2fs, %7d, %s", secs, nb, url)
}

++server.go++ (Web服務(wù)器示例)

package main

import (
    "fmt"
    "log"
    "net/http"
    "sync"
)

var mu sync.Mutex
var count int

func main() {
    http.HandleFunc("/", handler)
    http.HandleFunc("/counter", counter)
    log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "%s %s %s
", r.Method, r.URL, r.Proto)
    for k, v := range r.Header {
        fmt.Fprintf(w, "Header[%s] = %q
", k, v)
    }

    fmt.Fprintf(w, "Host = %q
", r.Host)
    fmt.Fprintf(w, "RemoteAddr = %q
", r.RemoteAddr)
    if err := r.ParseForm(); err != nil {
        log.Print(err)
    }
    for k, v := range r.Form {
        fmt.Fprintf(w, "Form[%q] = %q
", k, v)
    }
    mu.Lock()
    count++
    mu.Unlock()
    fmt.Fprintf(w, "URL.path = %q
", r.URL.Path)
}

func counter(w http.ResponseWriter, r *http.Request) {
    mu.Lock()
    fmt.Fprintf(w, "Count: %d
", count)
    mu.Unlock()
}

switch語句與C語言類似,但沒有fall through特性(有fallthrough語句)

命名類型,類似C語言的結(jié)構(gòu)體

指針,類似C語言,支持*&操作符,但不支持指針運(yùn)算

方法是命名類型里的函數(shù)函數(shù),與C++的類函數(shù)相似

接口是聲明了相同方法的抽象類型

go doc http.file可以查看包的幫助信息

注釋支持/* ... *///兩種方式

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/32568.html

相關(guān)文章

  • minikube代碼分析Go語言 - 3

    摘要:代碼分析參考博客源碼分析下載源碼可以從上下載編譯環(huán)境代碼下載到任意目錄,這里是設(shè)置環(huán)境變量,這里為這個目錄名很重要,的包都是以這個為基礎(chǔ)的鏈接到源碼目錄即可通過編譯 [TOC] minikube代碼分析 參考博客: minikube 源碼分析 下載 minikube源碼可以從github上下載: git clone [email protected]:kubernetes/minikube....

    novo 評論0 收藏0
  • 前端需要了解的 Docker Kubernetes 知識

    摘要:打開終端執(zhí)行,再開一個終端輸入輸出,則表示該服務(wù)沒有問題。將服務(wù)打包成鏡像,然后將鏡像實(shí)例化并運(yùn)行,方便部署。此處以我的賬號為例,需要推送到你自己的賬號。是一種自動化運(yùn)維工具,本文主要需要了解,,三個概念。至此成功使用部署應(yīng)用。 本文將以一個簡單的示例演示如何使用 Docker 與 Kubernetes 部署應(yīng)用上線。 Http Service 首先使用 Go 語言搭建一個簡單的 Ht...

    ChristmasBoy 評論0 收藏0
  • 前端需要了解的 Docker Kubernetes 知識

    摘要:打開終端執(zhí)行,再開一個終端輸入輸出,則表示該服務(wù)沒有問題。將服務(wù)打包成鏡像,然后將鏡像實(shí)例化并運(yùn)行,方便部署。此處以我的賬號為例,需要推送到你自己的賬號。是一種自動化運(yùn)維工具,本文主要需要了解,,三個概念。至此成功使用部署應(yīng)用。 本文將以一個簡單的示例演示如何使用 Docker 與 Kubernetes 部署應(yīng)用上線。 Http Service 首先使用 Go 語言搭建一個簡單的 Ht...

    孫吉亮 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<