Golang學習筆記(一)

(文章持續更新中...有志同道合的人能夠一塊兒探討下。整個系列(1~8)準備重寫,不過都是很基礎的入門筆記,想學到很深刻的東西則不建議閱讀...)前端

自學的前端開發,野生程序員,從最初的小白到能夠獨立完成先後端項目,從域名購買解析到服務器部署,都親自實踐過。最近想着找準方向沉澱下本身。定下了主攻前端,業餘研究Golang的小目標,至此開始記錄本身的學習歷程。程序員

題外話:由於屬於自學的,從最初服務器都不知道的懵懂小白到本身搭建LNMP環境,部署發佈代碼,中間的煎熬過程只有本身知道,深感沒人指導,沒人教的痛苦。自學有時候一個知識點你可能要3小時才能想明白,可是別人指導一下可能3分鐘就解決了。因此後來本身帶前端團隊的時候儘量多的幫助小夥伴們成長。當初剛入門的時候,一直到技術總監手把手叫我寫代碼,陪我連續熬了三個通宵以後,我的感受頓悟了,好像不少知識點均可以串聯起來懂了原理了,今後自學的路上障礙愈來愈少了,也多是積累到必定程度了吧,可是真心感謝那個陪我熬通宵的技術總監,沒有他的指導,不可能有個人今天。web

選擇Golang語言的緣由:以前嘗試過PHP作後端,用Laravel獨立完成事後端項目(Laravel給我感受的確很優雅,ORM也很不錯,操做數據庫爲所欲爲)。做爲前端程序員,Node.js是必知必會的,也能用Node.js開發後端程序。可是總感受Node.js是創建在C之上的,主觀以爲隔了一層libuv,多少會影響點性能。由於非科班出身,因此始終對底層的技術保持着敬畏。學C語言感受沒勇氣,學Java?不想禿頂。。。最終主觀臆斷的選擇學習Golang.我的以爲將來物聯網,邊緣計算,分佈式開發是大的趨勢,而Golang號稱是互聯網時代的編程語言,操做底層(docker)到微服務都有相應的解決方案。便可以跟操做系統底層打交道又能夠開發web項目,說不定還能夠來個彎道超車,對我來講是再適合不過了。docker

Go語言簡介

Golang是谷歌在2007年開源的。可讓你訪問操做系統,還提供了強大的網絡編程和併發編程支持數據庫

具備諸多優點:編程

  • 部署簡單
  • 原生併發優點
  • 語言設計良好
  • 執行性能好
  • 自帶垃圾回收
  • 編譯速度快
  • 代碼風格簡單
  • 建立大型網絡,節省硬件資源
  • Google開源和泰斗級的開發大師
  • 目前性能上接近Java,將來可能超越

Go是靜態,編譯型語言

自帶編譯器將源代碼編譯成二進制格式。二進制文件能夠在不一樣的平臺上運行,解決了跨平臺的問題。後端

建立Go程序->編譯程序->運行編譯獲得的可執行文件,是開發Go程序的必要步驟。bash

原生的併發優點

Go語言在多核併發上擁有原生的設計優點。從底層原生支持併發,無須第三方庫、就能輕鬆充分利用多核CPU服務器。服務器

Go語言重構的系統能使用更少的硬件資源而有更高的併發和 I/O 吞吐表現網絡

goroutine 能夠理解爲一種虛擬線程。Go 語言運行時會參與調度gotoutine 合理地分配到每一個 CPU中。

goroutine之間使用通道(channel)進行通訊

package main

import (
    "fmt" 
    "math/rand"
    "time"
)

func producer(header string, channel chan<- string) {
     // 不停地生產數據
     for {
            // 將隨機數和字符串格式化爲字符串發送給通道
            channel <- fmt.Sprintf("%s: %v", header, rand.Int31())
            // 等待1秒
            time.Sleep(time.Second)
        }
}

func customer(channel <-chan string) {
     // 不停地獲取數據
     for {
            // 從通道中取出數據, 此處會阻塞直到信道中返回數據
            message := <-channel
            fmt.Println(message)
        }
}
func main() {
    // 建立一個字符串類型的通道
    channel := make(chan string)
    // 建立producer()函數的併發goroutine
    go producer("cat", channel)
    go producer("dog", channel)
    customer(channel)
}
複製代碼

Go建立一個HTTP 服務器

package main

import (
    "net/http"
)

func main() {
    http.Handle("/", http.FileServer(http.Dir(".")))
    http.ListenAndServe(":8888", nil)
}
複製代碼

我的感受Golang在建立http服務器簡潔性方面跟Node.js有得一拼

相關文章
相關標籤/搜索