課程目錄

一  簡介

Go語言出自Ken Thompson、Rob Pike和Robert Griesemer之手,起源于2007年,并在2009年正式對外發(fā)布,其實都是Google的,設(shè)計Go語言的初衷都是為了滿足Google的需求。Go的主要目標(biāo)是“兼具Python等動態(tài)語言的開發(fā)速度和C/C++等編譯型語言的性能與安全性”,旨在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,具有“部署簡單、并發(fā)性好、語言設(shè)計良好、執(zhí)行性能好”等優(yōu)勢。最主要還是為了并發(fā)而生,并發(fā)是基于goroutine的,goroutine類似于線程,但并非線程,可以將goroutine理解為一種虛擬線程。Go語言運行時會參與調(diào)度goroutine,并將goroutine合理地分配到每個CPU中,最大限度地使用CPU性能。

二  環(huán)境

我們玩Java的時候需要下載JDK,類似于此,用Go開發(fā)也需要下載Go,里面提供各種develop-kit、library以及編譯器。在官網(wǎng)下載mac版本pkg后直接安裝,最后用 go version 命令驗證版本:

然后就是設(shè)置這兩個環(huán)境變量,mac系統(tǒng)是在 .bash_profile 文件里面:

export GOROOT=/usr/local/go

export GOPATH=$HOME/go

GOROOT:表示的是Go語言編譯、工具、標(biāo)準(zhǔn)庫等的安裝路徑,其實就相當(dāng)于配置JAVA_HOME那樣。

GOPATH:這個和Java有點不一樣,Java里并不需要設(shè)置這個變量,這個表示Go的工作目錄,是全局的,當(dāng)執(zhí)行Go命令的時候會依賴這個目錄,相當(dāng)于一個全局的workspace。一般還會把$GOPATH/bin設(shè)置到PATH目錄,這樣編譯過的代碼就可以直接執(zhí)行了。

1  純文本開發(fā)

編寫代碼,可以保存在任意地方,例如新建一個helloworld目錄,創(chuàng)建hello.go文件:

package main

import "fmt"

func main() {    

    fmt.Println("hello, world")

}

然后執(zhí)行 go build hello.go 就可以編譯出hello文件,在./hello就可以執(zhí)行了;或者直接 go run hello.go 合二為一去執(zhí)行。執(zhí)行這個命令并不需要設(shè)置環(huán)境變量就可以了。看起來和c差不多,但是和Java不一樣,運行的時候不需要虛擬機(jī)。早期的GO工程也是使用Makefile來編譯,后來有了強(qiáng)大的命令 go build、go run,可以直接識別目錄還是文件。

2  GoLand

自動import,超爽的體驗!不用按command + /了!

運行項目需要設(shè)置build config,和Android、Java的都差不多,例如創(chuàng)建一個hello-goland項目:

導(dǎo)入go module項目的時候需要勾選這項,否則無法像maven/gradle那樣sync下載依賴:

3  VSCODE

直接搜索Go插件,第一個最多安裝量的就是了,我還沒用過所以不太清楚如何。

三  工程結(jié)構(gòu)

在設(shè)置GOPATH環(huán)境變量的時候,這個目錄里面又分了三個子目錄bin、pkg、src,分別用于存放可執(zhí)行文件、包文件和源碼文件。當(dāng)我們執(zhí)行Go命令的時候,如果我們指定的不是當(dāng)前目錄的文件或者絕對路徑的目錄的話,就會去GOPATH目錄的去找。這樣在GOPATH目錄創(chuàng)建了xxx的目錄后,就可以在任意地方執(zhí)行 go build xx 命令來構(gòu)建或者運行了。

pkg目錄應(yīng)該是在執(zhí)行 go install 后生成的包文件,包括.a這樣的文件,相當(dāng)于一個歸檔。

├── bin

│   ├── air

│   ├── govendor

│   ├── swag

│   └── wire

├── pkg

│   ├── darwin_amd64

│   ├── mod

│   └── sumdb

└── src

    ├── calc

    ├── gin-blog

    ├── github.com

    ├── golang.org

    ├── google.golang.org

    ├── gopkg.in

    └── simplemath

這樣對于我們具體項目來說并不好,沒有Workspace的概念來隔離每個項目了,所以我覺得這個GOPATH目錄放的應(yīng)該是公用的項目,例如開源依賴的。我們在開發(fā)過程中,也會下載很多的依賴,這些依賴都下載到這個目錄,和我們的項目文件混在一起了。

另外,通過IDE可以設(shè)置project的GOPATH,相當(dāng)于在執(zhí)行的時候給GOPATH增加了一個目錄變量,也就是說,我們創(chuàng)建一個項目,然后里面也有bin、src、pkg這三個目錄,和GOPATH一樣的,本質(zhì)上,IDE在運行的時候其實就是設(shè)置了一下GOPATH:

GOPATH=/Users/fuxing/develop/testgo/calc-outside:/Users/fuxing/develop/go #gosetup

Go語言在尋找變量、函數(shù)、類屬性及方法的時候,會先查看GOPATH這個系統(tǒng)環(huán)境變量,然后根據(jù)該變量配置的路徑列表依次去對應(yīng)路徑下的src目錄下根據(jù)包名查找對應(yīng)的目錄,如果對應(yīng)目錄存在,則再到該目錄下查找對應(yīng)的變量、函數(shù)、類屬性和方法。

其實官方提供了Go Modules的方法更好解決。

1  Go Modules

從Go 1.11版本開始,官方提供了Go Modules管理項目和依賴,從1.13版本開始,更是默認(rèn)開啟了對Go Modules的支持,使用Go Modules的好處是顯而易見的 —— 不需要再依賴GOPATH,你可以在任何位置創(chuàng)建Go項目,并且在國內(nèi),可以通過 GOPROXY 配置鏡像源加速依賴包的下載。也就是說,創(chuàng)建一個項目就是一個mod,基本上目前Go開源項目都是這樣做的。其實就是類似于Maven和Gradle。

// 創(chuàng)建mod項目,也是可以用IDE來new一個mod項目的:

go mod init calc-mod

// 一般開源在github上面的項目名字是這樣的;和maven、gradle不一樣的是,開發(fā)完成根本不需要發(fā)布到倉庫!只要提交代碼后打tag就可以了

go mod init github.com/fuxing-repo/fuxing-module-name

// 創(chuàng)建一個模塊:執(zhí)行這個命令主要是多了一個go.mod文件,里面就一行內(nèi)容:

module calc-mod

// import以后,執(zhí)行下載依賴命令,不需要編輯go.mod文件。依賴會下載到GOPATH/pkg/mod目錄

go list

用GoLand來打開不同的項目,顯示依賴的外部庫是不一樣的,如果是用GOPATH創(chuàng)建的項目,需要用命令下載依賴包到GOPATH:

go get -u github.com/fuxing-repo/fuxing-module-name

四  語法

1  包:Package 和 Import

Java里面的包名一般是很長的,和文件夾名稱對應(yīng),作用就是命名空間,引入的時候需要寫長長的一串,也可以用通配符:

Go里面一般的包名是當(dāng)前的文件夾名稱,同一個項目里面,可以存在同樣的包名,如果同時都需要引用同樣包名的時候,就可以用alias區(qū)分,類似于JS那樣。一般import的是一個包,不像Java那樣import具體的類。同一個包內(nèi),不同文件,但是里面的東西是可以使用的,不需要import。這有點類似于C的include吧。如果多行的話,用括號換行包起來。

Go語言中,無論是變量、函數(shù)還是類屬性及方法,它們的可見性都是與包相關(guān)聯(lián)的,而不是類似Java那樣,類屬性和方法的可見性封裝在對應(yīng)的類中,然后通過 private、protected 和 public 這些關(guān)鍵字來描述其可見性,Go語言沒有這些關(guān)鍵字,和變量和函數(shù)一樣,對應(yīng)Go語言的自定義類來說,屬性和方法的可見性根據(jù)其首字母大小寫來決定,如果屬性名或方法名首字母大寫,則可以在其他包中直接訪問這些屬性和方法,否則只能在包內(nèi)訪問,所以Go語言中的可見性都是包一級的,而不是類一級的。

在Java里面,只有靜態(tài),或者對象就可以使用點運算符,而且是極其常用的操作,而在Go里面,還可以用一個包名來點,這就是結(jié)合了import來使用,可以點出一個函數(shù)調(diào)用,也可以點出一個結(jié)構(gòu)體,一個接口。另外區(qū)別于C,不管是指針地址,還是對象引用,都是用點運算符,不需要考慮用點還是箭頭了!

郵箱
huangbenjincv@163.com

通河县| 保定市| 彩票| 沾益县| 尖扎县| 大理市| 锡林浩特市| 连南| 安新县| 凯里市| 华阴市| 库尔勒市| 西青区| 安平县| 攀枝花市| 汉源县| 钦州市| 抚顺县| 繁峙县| 泾川县| 盐源县| 临泉县| 满城县| 田林县| 建阳市| 武邑县| 南澳县| 姜堰市| 海兴县| 浪卡子县| 北流市| 阳城县| 桑植县| 交城县| 阜新| 肇庆市| 北安市| 错那县| 瑞昌市| 阜康市| 龙南县|