1. 程式人生 > >go 學習筆記之工作空間

go 學習筆記之工作空間

搭建好 Go 的基本環境後,現在可以正式開始 Go 語言的學習之旅,初學時建議在預設的 GOPATH 工作空間規範編寫程式碼,基本目錄結構大概是這個樣子.

.
|-- bin
|   `-- hello.exe
|-- pkg
|   `-- windows_amd64
|       `-- github.com
|           `-- snowdreams1006
|               `-- learn-go
|                   `-- strings.a
`-- src
    `-- github.com
        `-- snowdreams1006
            `-- learn-go
                |-- README.md
                |-- hello
                |   `-- hello.go
                `-- strings
                    |-- reverse.go
                    `-- reverse_test.go

Go 相關的程式碼儲存在工作空間中,而工作空間目錄預設情況下是 GOPATH 環境變數所指向的目錄(例如: GOPATH=C:\Users\snowdreams006-win7\go).

工作空間下一般應包括三個一級子目錄,分別是 src,pkgbin 目錄,其中最重要的就是 src 原始碼目錄,其餘兩個目錄都是派生目錄.

  • src 目錄是原始碼目錄,是平時寫程式碼的地方.
  • pkg 目錄是包物件目錄,裡面的檔案大多以 .a 為字尾名,Go 工具自動處理,暫時不用關心.
  • bin 目錄是可執行命令目錄,是最終產出的檔案,例如 Windows 平臺一般會生成 .exe 檔案.

如果你剛剛安裝 Go

語言或者不是預設形式安裝的 Go,開啟命令列視窗執行 go env 檢視 GOPATH 那一項,GOPATH 指代的目錄就是工作空間.

體驗別人的 Go 命令

預設情況下,剛剛安裝完畢的 Go 環境並不會自動建立工作空間目錄,可以手動建立也可以執行別人的 Go 命令時順便建立.

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 /
# 初始時工作空間並未建立
$ ls $GOPATH
ls: cannot access 'C:\Users\snowdreams1006-win7\go': No such file or directory

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 /
# 下載別人的 `Go` 命令順便建立了工作空間
$ go get github.com/snowdreams1006/learn-go/hello

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 /
# 已經按照標準目錄結構建立完畢,目前有src和bin目錄就足夠了
$ ls $GOPATH
bin/  src/

執行完 go get github.com/snowdreams1006/learn-go/hello 命令後,工作空間目前已近乎標準目錄.

如果 go get 命令半天沒什麼反應,不要著急,說不定正在下載,只是比較慢而已,如果想要看到下載過程,可以新增額外引數: go get -u -v

可以看出,go get 命令下載了 hello 命令所依賴的檔案並生成 bin/hello.exe 可執行檔案,現在終於可以說一聲 Hello world!

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ hello
!oG,olleH

這個是啥?怎麼不是傳說中的 Hello World ?

不管怎麼說,建立工作空間的目的已經達到了,不是嗎?

聰明的你,或許已經發現輸出的語句的確不是 Hello World 而是 Hello Go 反過來寫!

打造自己的 Go 命令

如果手頭上沒有 Go 專案或者說想要從零開發 Go 專案的話,那麼只能手動建立工作空間了.

我們已經知道了工作空間的規範,但是現在涉及到自定義專案,同樣需要確定專案的規範.

一般說來,專案需要唯一id用於區分其他可能出現的同名專案,也就是名稱空間的概念.

作為個人開源專案,同廣大的 Go 專案規範一樣託管到 github.com 網站,因此名稱空間 github.com/user 作為基本路徑.

重要區別:
Go 的名稱空間(即基本路徑)是域名正寫: github.com/snowdreams1006,如果是其他語言,名稱空間可能就是域名反寫形式: com.github.snowdreams1006 .

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~
# 當前並未建立過工作空間
$ ls $GOPATH
ls: cannot access 'C:\Users\snowdreams1006-win7\go': No such file or directory

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~
# 在工作空間下建立 `learn-go` 專案
$ mkdir -p $GOPATH/src/github.com/snowdreams1006/learn-go/hello

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~
# 在 `learn-go` 專案下建立 `hello.go` 檔案
$ vim $GOPATH/src/github.com/snowdreams1006/learn-go/hello/hello.go

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~
# `hello.go` 檔案內容,輸出 `Hello world`
$ cat $GOPATH/src/github.com/snowdreams1006/learn-go/hello/hello.go
package main

import "fmt"

func main() {
        fmt.Printf("Hello, world.\n")
}

現在 Go 語言版的 Hello World 已經編寫完畢,接下來讓我們編輯輸出並安裝 hello 檔案命令吧!

在命令列視窗執行 go install github.com/snowdreams1006/learn-go/hello 命令會在工作空間的 bin 目錄下生成 hello.exe 可執行檔案.

現在命令列視窗不負眾望,輸出了期待已久的 Hello World!

簡單講解下 Go 命令

無論是下載別人的遠端程式碼還是自己從零編寫程式碼,在命令列中都用到了相應命令,go getgo install 等.

  • go get : 下載遠端程式碼包,如果本地已安裝,則執行邏輯退化為 go install.
  • go install : 安裝本地依賴包,如果本地沒有相關依賴,則報錯提示無法找到相關依賴包.

當然 Go 支援的常用命令遠遠不止這兩個,直接輸入 go 自然會提示有哪些命令可供使用,如果想要查詢具體某一個命令的幫助文件,則輸入 go help <command> 即可,例如 go help get

這些命令比較簡單,不用翻譯也能猜出八九不離十,故此不浪費時間一一闡述.

下面直接上程式碼親測執行一遍相關命令.

go get 下載程式碼包

go get github.com/golang/example/hello 下載 Go 官方示例的 hello 程式碼包.

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ tree
.
|-- bin
|   `-- hello.exe
`-- src
    `-- github.com
        `-- snowdreams1006
            `-- learn-go
                `-- hello
                    `-- hello.go

6 directories, 2 files

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ go get github.com/golang/example/hello

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ tree
.
|-- bin
|   `-- hello.exe
`-- src
    `-- github.com
        |-- golang
        |   `-- example
        |       |-- LICENSE
        |       |-- README.md
        |       |-- appengine-hello
        |       |   |-- README.md
        |       |   |-- app.go
        |       |   |-- app.yaml
        |       |   `-- static
        |       |       |-- favicon.ico
        |       |       |-- index.html
        |       |       |-- script.js
        |       |       `-- style.css
        |       |-- gotypes
        |       |   |-- Makefile
        |       |   |-- README.md
        |       |   |-- defsuses
        |       |   |   `-- main.go
        |       |   |-- doc
        |       |   |   `-- main.go
        |       |   |-- go-types.md
        |       |   |-- hello
        |       |   |   `-- hello.go
        |       |   |-- hugeparam
        |       |   |   `-- main.go
        |       |   |-- implements
        |       |   |   `-- main.go
        |       |   |-- lookup
        |       |   |   `-- lookup.go
        |       |   |-- nilfunc
        |       |   |   `-- main.go
        |       |   |-- pkginfo
        |       |   |   `-- main.go
        |       |   |-- skeleton
        |       |   |   `-- main.go
        |       |   |-- typeandvalue
        |       |   |   `-- main.go
        |       |   `-- weave.go
        |       |-- hello
        |       |   `-- hello.go
        |       |-- outyet
        |       |   |-- Dockerfile
        |       |   |-- containers.yaml
        |       |   |-- main.go
        |       |   `-- main_test.go
        |       |-- stringutil
        |       |   |-- reverse.go
        |       |   `-- reverse_test.go
        |       `-- template
        |           |-- image.tmpl
        |           |-- index.tmpl
        |           `-- main.go
        `-- snowdreams1006
            `-- learn-go
                `-- hello
                    `-- hello.go

25 directories, 35 files

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$

原本 $GOPATH/src 原始碼目錄只有我們自己的 github.com/snowdreams1006/learn-go 專案,獲取遠端 golang/hello 程式碼包後多了一大堆原始碼檔案.

真的是神奇的操作,其餘語言呼叫開源工具一般都是作為依賴放到非原始碼目錄,Go 直接放到正在編寫的原始碼目錄,看起來第三方原始碼像是我們自己寫的一樣,只不過用名稱空間區分開了而已!

go test 測試程式碼包

Go 自帶輕量級的測試框架,測試檔案命名是 xxx_test.go ,檔案內的方法簽名是 TestXXX .

go test github.com/golang/example/stringutil 測試 stringutil 程式碼包,是因為包記憶體在測試檔案 reverse_test.go

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ go test github.com/golang/example/stringutil
ok      github.com/golang/example/stringutil    0.342s

go install 安裝程式碼包

go install github.com/golang/example/hello 安裝程式碼包,執行可執行檔案 hello 輸出 Hello, Go examples!

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ go install github.com/golang/example/hello

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
$ hello
Hello, Go examples!

go build 編譯程式碼包

上述命令我們都是在 golang/example 專案下進行演示的,不能厚此薄彼,下面這兩個命令還是演示我們自己手寫的 hello 命令檔案吧!

首先切換到 hello 目錄下,這樣省的輸入一長串的路徑,在當前目錄下執行 go 命令可以省略檔案路徑.

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go
# 切換到 `learn-go` 專案的 `hello` 目錄
$ cd $GOPATH/src/github.com/snowdreams1006/learn-go/hello

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/earn-go/hello
$ ls
hello.go

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/earn-go/hello
# go build 省略檔案路徑表示在當前目錄下進行編譯,輸出檔案也是當前目錄下
$ go build

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/earn-go/hello
$ ls
hello.exe*  hello.go

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/earn-go/hello
# 此時直接執行 `hello` 命令,執行的的是 `$GOPATH/bin` 目錄下的命令而不是當前目錄下的 `hello`
$ hello
Hello, Go examples!

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/learn-go/hello
$ ./hello
Hello, world.

上述演示結果,展示了切換到當前目錄下可以直接省略程式碼包路徑,預設輸出的可執行檔案也由原先的 $GOPATH/bin 目錄變成當前目錄.

直接執行 hello 命令輸出的結果是原先的 $GOPATH/bin/hello 命令而不是當前目錄下的 hello,至於為什麼如此,暫時不太理解.

當然想要運行當前目錄下的 hello.exe 命令檔案也很簡單,指定路徑即可: ./hello

go run 執行程式碼包

go build 命令或者 go install 命令都會生成可執行二進位制檔案,然後執行該二進位制檔案才能輸出命令結果.

go run 就是一步到位的命令,不用生成檔案直接輸出命令的執行結果,有時候這種方式也很有用!

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/learn-go/hello
$ ls
hello.go

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/learn-go/hello
$ go run hello.go
Hello, world.

snowdreams1006-win7@WIN-FANS2DDDB06 MINGW64 ~/go/src/github.com/snowdreams1006/learn-go/hello
$ ls
hello.go

值得注意的是,go run 後面緊跟著的是檔名,不能像 go build 那樣省略包路徑,否則會報錯.

Go 基本環境小結

預設安裝的 Go 省心省力,自動幫我們設定好相關的環境變數,至於這些變數是幹嘛用的以及怎麼自定義修改,建議初學時不要深究,先搭建好基本的開發環境再說.

go env 命令可以輸出 Go 的相關配置資訊,GOROOTGo 的安裝目錄,GOPATHGo 的工作空間目錄,這是 Go 本身最基本的配置資訊.

如果不太瞭解這部分內容,可以翻看上一篇文章,這裡就不詳細闡述了.

Go 的工作空間下面有 src ,binpkg 三個平行目錄,其中 src 下面才是我們真正編寫程式碼的目錄.

Go 語言相關的專案既然都放在 src 目錄下就有一定的命名規範,參考 github.com/snowdreams1006/learn-gogithub.com/golang/example 這種形式.

測試 Go 語言的安裝環境以及進行簡單的命令驗證,這些操作本身比較簡單,用不著強大的 IDE ,但是學習 Go 語言如果沒有 IDE 的輔助,那麼很難想象會是什麼樣的局面.

因此,下一節將開始介紹 Go 開發的 IDE 環境配置,感覺離工程化開發又邁進一步呢!

相關推薦

go 學習筆記工作空間

搭建好 Go 的基本環境後,現在可以正式開始 Go 語言的學習之旅,初學時建議在預設的 GOPATH 工作空間規範編寫程式碼,基本目錄結構大概是這個樣子. . |-- bin | `-- hello.exe |-- pkg | `-- windows_amd64 | `-- github.

MongoDB 學習筆記 地理空間索引入門

geometry 分享 如果 sphere mce insert del sap 計劃 地理空間索引: 地理空間索引,可用於處理基於地理位置的查詢。 Point:用於指定所在的具體位置,我們以restaurants為例: db.restaurants.insert({

2018.5.9 學習筆記工作練習

query 考試 視覺 制作 工作 處理器 模板 處理 template 工作之余準備oracle以及shell考試(暫定於5.26),還有下個月初的前端技能考試,我愛考試,使我進步! 根據兵哥安排的試用員工培養計劃,我的開發規範這塊目前大概看完了前端編寫規範,還缺少: 1

ROS學習筆記(一):工作空間的定義和建立方法

一、工作空間(Workspace): 定義 :存放工程開發相關檔案的資料夾。 檔案構成:( Workspace 下基本資料夾) src:程式碼空間,放置功能包原始碼的空間; build:編譯空間,編譯過程中產生的中間檔案; devel:開發空間,編譯完成後的

Go學習筆記高階資料型別

高階資料型別,僅僅是做個概念認識,等到其他相關知識的學習時,再著重分析。 1 function 將 function 作為資料型別的語言有很多,函數語言程式設計的核心理念。 function 是“第一等公民”,function 與其他資料型別一樣,處於平等地位,可以賦值給

go 學習筆記初識 go 語言

Go 是一種開源程式語言,可以輕鬆構建簡單,可靠,高效的軟體. 摘錄自 github: https://github.com/golang/go,其中官網(國外): https://golang.org 和官網(國內): https://golang.google.cn/ Go 是 Google 公司

go 學習筆記環境搭建

千里之行始於足下,開始 Go 語言學習之旅前,首先要搭建好本地開發環境,然後就可以放心大膽瞎折騰了. Go 的環境安裝和其他語言安

go 學習筆記走進Goland編輯器

工欲善其事必先利其器,命令列工具雖然能夠在一定程度上滿足基本操作的需求,但實際工作中總不能一直使用命令列工具進行編碼操作吧? 學習 Go 語言同樣如此,為此需要尋找一個強大的 IDE 整合環境幫助我們快速開發,據我所知,市面上比較流行的可能有三個選擇: LiteIDE X : LiteIDE 是一款簡單,開

go 學習筆記有意思的變數和不安分的常量

首先希望學習 Go 語言的愛好者至少擁有其他語言的程式設計經驗,如果是完全零基礎的小白使用者,本教程可能並不適合閱讀或嘗試閱讀看看,系列筆記的目標是站在其他語言的角度學習新的語言,理解 Go 語言,進而寫出真正的 Go 程式. 程式語言中一般都有變數和常量的概念,對於學習新語言也是一樣,變數指的是不同程式語言

go 學習筆記值得特別關注的基礎語法有哪些

在上篇文章中,我們動手親自編寫了第一個 Go 語言版本的 Hello World,並且認識了 Go 語言中有意思的變數和不安分的常量. 相信通過上篇文章的斐波那契數列,你已經初步掌握了 Go 語言的變數和常量與其他主要的程式語言的異同,為了接下來更好的學習和掌握 Go 的基礎語法,下面先簡單回顧一下變數和常量

go 學習筆記陣列還是切片都沒什麼不一樣

上篇文章中詳細介紹了 Go 的基礎語言,指出了 Go 和其他主流的程式語言的差異性,比較側重於語法細節,相信只要稍加記憶就能輕鬆從已有的程式語言切換到 Go 語言的程式設計習慣中,儘管這種切換可能並不是特別順暢,但多加練習尤其是多多試錯,總是可以慢慢感受 Go 語言之美! 在學習 Go 的內建容器前,同樣的,

go 學習筆記go是不是面嚮物件語言是否支援面對物件程式設計?

面向物件程式設計風格深受廣大開發者喜歡,尤其是以 C++, Java 為典型代表的程式語言大行其道,十分流行! 有意思的是這兩中語言幾乎毫無意外都來源於 C 語言,卻不同於 C 的面向過程程式設計,這種面向物件的程式設計風格給開發者帶來了極大的便利性,解放了勞動,鬆耦合,高內聚也成為設計的標準,從而讓我們

go 學習筆記詳細說一說封裝是怎麼回事

關注公眾號[雪之夢技術驛站]檢視上篇文章 猜猜看go是不是面嚮物件語言?能不能面向物件程式設計? 雖然在上篇文章中,我們通過嘗試性學習探索了 Go 語言中關於面向物件的相關概念,更確切的說是關於封裝的基本概念以及相關實現. 但那還遠遠不夠,不能滿足於一條路,而是應該儘可能地多走幾條路,只有這樣才能為以後可

go 學習筆記是否支援以及如何實現繼承

熟悉面向物件的小夥伴們可能會知道封裝,繼承和多型是最主要的特性,為什麼前輩們會如此看重這三種特性,真的那麼重要嗎? 什麼是封裝 什麼是封裝,封裝有什麼好處以及怎麼實現封裝? 相信大多數小夥伴們都有自己的理解,簡而言之,言而簡之,封裝是遮蔽內部實現細節,僅僅對外暴露出有價值介面. 正如平時工作中使用的電

go 學習筆記萬萬沒想到寵物店竟然催生出面向介面程式設計?

到底是要貓還是要狗 在上篇文章中,我們編撰了一則簡短的小故事用於講解了什麼是面向物件的繼承特性以及 Go 語言是如何實現這種繼承語

go 學習筆記無心插柳柳成蔭的介面和無為而治的空介面

如果你還了解程式設計概念中的介面概念,那麼我建議你最好還是先閱讀上一篇文章.詳情請點選 go 學習筆記之萬萬沒想到寵物店竟然催生出面向介面程式設計? ,否則的話,請自動忽略上文,繼續探索 Go 語言的介面有什麼不同之處. 如無法自動跳轉到公眾號「雪之夢技術驛站」文章,可以點選我的頭像,動動你的小手翻翻歷史文

go 學習筆記僅僅需要一個示例就能講清楚什麼閉包

本篇文章是 Go 語言學習筆記之函數語言程式設計系列文章的第二篇,上一篇介紹了函式基礎,這一篇文章重點介紹函式的重要應用之一: 閉包 空談誤國,實幹興邦,以具體程式碼示例為基礎講解什麼是閉包以及為什麼需要閉包等問題,下面我們沿用上篇文章的示例程式碼開始本文的學習吧! 斐波那契數列是形如 1 1 2 3 5

go 學習筆記10 分鐘簡要理解 go 語言閉包技術

閉包是主流程式語言中的一種通用技術,常常和函數語言程式設計進行強強聯合,本文主要是介紹 Go 語言中什麼是閉包以及怎麼理解閉包. 如果讀者對於 Go 語言的閉包還不是特別清楚的話,可以參考上一篇文章 go 學習筆記之僅僅需要一個示例就能講清楚什麼閉包. 或者也可以直接無視,因為接下來會回顧一下前情概要,現在你

go 學習筆記解讀什麼是defer延遲函式

Go 語言中有個 defer 關鍵字,常用於實現延遲函式來保證關鍵程式碼的最終執行,常言道: "未雨綢繆方可有備無患". 延遲函式就是這麼一種機制,無論程式是正常返回還是異常報錯,只要存在延遲函式都能保證這部分關鍵邏輯最終執行,所以用來做些資源清理等操作再合適不過了. 出入成雙有始有終

Go語言學習筆記簡單的幾個排序

1.實現一個插入排序 核心思路是抽到的牌與前面的牌進行比較,如果抽到的牌小,那麼就互相交換位置.(正序排列) 1: func insert_sort(a []int) []int { 2: for i:=1;i<len(a);i++ { 3: for j:=i;j>0