亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

創建第一個Go語言程序Hello,Go!

2020-04-01 19:25:18
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了創建第一個Go語言程序Hello,Go!本文詳細的給出項目創建、代碼編寫的過程,同時講解了GOPATH、Go install等內容,需要的朋友可以參考下
 

建立一個用于編寫Go程序的工作目錄go-examples,其絕對路徑為/home/go-examples.開始編寫我們的第一個Go程序。

一、在go-examples下創建一個文件hello.go

 

復制代碼代碼如下:

//hello.go   
package main

 

import "fmt"//實現格式化的I/O  
 
/*Printf someting*/  
func main(){   
       fmt.Printf("Hello,GO!/n")   
}

 

我們來分析下這個程序:

1、程序中的第2行這個是必須的。所有的Go文件以package <something>開頭,對于獨立運行的執行文件必須是package main;

2、第4行說需要將”fmt”包加入main。不是main的其他包都被稱為庫,其他許多編程語言有著類似的概念。

3、第1行和第4行中的//和/*---*/都是注釋

4、package main 必須首先出現,緊跟著是import。在Go中,package 總是首先出現,然后是import,然后是其他所有內容。當Go 程序在執行的時候,首先調用的函數是main.main(),這是從C 中繼承而來。這里定義了這個函數;

5、第8行調用了來自于fmt包的函數打印字符串到屏幕

二、編譯和運行代碼

編譯該源文件并執行生成的可執行文件

 

復制代碼代碼如下:

[root@localhost go-examples]# go build hello.go   
[root@localhost go-examples]# ls   
hello hello.go   
[root@localhost go-examples]# ./hello   
Hello,GO!  

 

通過go build加上要編譯的Go源文件名,我們即可得到一個可執行文件,默認情況下這個文件的名字為源文件名字去掉.go后綴。當然我們也可以通過-o選項來指定其他名字:

 

復制代碼代碼如下:

[root@localhost go-examples]# go build -o firstgo hello.go   
[root@localhost go-examples]# ls   
firstgo hello.go  

 

如果我們在go-examples目錄下直接執行go build命令,后面不帶文件名,我們將得到一個與目錄名同名的可執行文件:

 

復制代碼代碼如下:

[root@localhost go-examples]# go build   
[root@localhost go-examples]# ls   
go-examples hello.go  

 

三、程序入口點(entry point)和包(package)

Go保持了與C家族語言一致的風格:即目標為可執行程序的Go源碼中務必要有一個名為main的函數,該函數即為可執行程序的入口點。除此之外 Go還增加了一個約束:作為入口點的main函數必須在名為main的package中。正如上面hellogo.go源文件中的那樣,在源碼第 一行就聲明了該文件所歸屬的package為main。

Go去除了頭文件的概念,而借鑒了很多主流語言都采用的package的源碼組織方式。package是個邏輯概念,與文件沒有一一對應的關系。 如果多個源文件都在開頭聲明自己屬于某個名為foo的包,那這些源文件中的代碼在邏輯上都歸屬于包foo(這些文件最好在同一個目錄下,至少目前 的Go版本還無法支持不同目錄下的源文件歸屬于同一個包)。

我們看到hellogo.go中import一個名為fmt的包,并利用該包內的Printf函數輸出"Hello, Go!"。直覺告訴我們fmt包似乎是一個標準庫中的包。沒錯,fmt包提供了格式化文本輸出以及讀取格式化輸入的相關函數,與C中的printf或 scanf等類似。我們通過import語句將fmt包導入我們的源文件后就可以使用該fmt包導出(export)的功能函數了(比如 Printf)。

在C中,我們通過static來標識局部函數還是全局函數。而在Go中,包中的函數是否可以被外部調用,要看該函數名的首母是否為大寫。這是一種 Go語言固化的約定:首母大寫的函數被認為是導出的函數,可以被包之外的代碼調用;而小寫字母開頭的函數則僅能在包內使用。在例子中你也看到了 fmt包的Printf函數其首母就是大寫的。

四、GOPATH

把上面的hellogo.go稍作改造,拆分成兩個文件:main.go和hello.go

 

復制代碼代碼如下:

//hello.go   
package hello   
  
import "fmt"  
  
func Hello(who string){   
     fmt.Printf("Hello,%s!/n", who)   
}  

 

 

復制代碼代碼如下:

//main.go   
package main   
  
import "hello"  
  
func main(){   
     hello.Hello("GO")   
}

 

用go build編譯main.go 結果如下

 

復制代碼代碼如下:

[root@localhost go-examples]# go build main.go   
main.go:4:8: import "hello": cannot find package  

 

編譯器居然提示無法找到hello這個package,而hello.go中明明定義了package hello了。這是怎么回事呢?原來go compiler搜索package的方式與我們常規理解的有不同,Go在這方面也有一套約定,這里面涉及到一個重要的環境變量:GOPATH。我們可以使用go help gopath來查看一下有關gopath的manual。

Go compiler的package搜索順序是這樣的,以搜索hello這個package為例:

* 首先,Go compiler會在GO安裝目錄(GOROOT,這里是/home/go/)下查找是否有src/pkg/hello相關包源碼;如果沒有則繼續;

* 如果export GOPATH=PATH1:PAHT2,則Go compiler會依次查找是否存在PATH1/src/hello、PATH2/src/hello;配置在GOPATH中的PATH1和PATH2被稱作workplace;

* 如果在上述幾個位置均無法找到hello這個package,則提示出錯。

在本例子中,我們尚未設置過GOPATH環境變量,也沒有建立類似PATH1/src/hello這樣的路徑,因此Go compiler顯然無法找到hello這個package了。我們來設置一下GOPATH變量并建立相關目錄:

 

復制代碼代碼如下:

[root@localhost go-examples]# export GOPATH=/home/go-examples/   
[root@localhost go-examples]# mkdir src/hello -p   
[root@localhost go-examples]# mv hello.go src/hello/   
[root@localhost go-examples]# go build main.go   
[root@localhost go-examples]# ls   
main main.go src   
[root@localhost go-examples]# ./main   
Hello,GO!  

 

五、Go install

將main.go移到src/main中,這樣這個demo project顯得更加合理,所有源碼均在src下:

復制代碼代碼如下:

[root@localhost go-examples]# cd src/   
[root@localhost src]# ls   
hello main.go  

Go提供了install命令,與build命令相比,install命令在編譯源碼后還會將可執行文件或庫文件安裝到約定的目錄下。我們以main目錄為例:
復制代碼代碼如下:

[root@localhost src]# cd main/   
[root@localhost main]# go install  

install命令執行后,我們發現main目錄下沒有任何變化,原先build時產生的main可執行文件也不見了蹤影。別急,Go install也有一套自己的約定:

 

* go install(在src/DIR下)編譯出的可執行文件以其所在目錄名(DIR)命名

* go install將可執行文件安裝到與src同級別的bin目錄下,bin目錄由go install自動創建

* go install將可執行文件依賴的各種package編譯后,放在與src同級別的pkg目錄下

現在我們來看看bin目錄:

 

復制代碼代碼如下:

[root@localhost go-examples]# ls   
bin pkg src   
[root@localhost go-examples]# ls bin/   
main  

 

的確出現一個bin目錄,并且剛剛編譯的程序main在bin下面。

hello.go編譯后并非可執行程序,在編譯main的同時,由于main依賴hello package,因此hello也被關聯編譯了。這與單獨在hello目錄下執行install的結果是一樣的,我們試試:

 

復制代碼代碼如下:

[root@localhost src]# cd hello/   
[root@localhost hello]# go install   
[root@localhost hello]# ls /home/go-examples/   
bin pkg src  

 

在我們的workspace(go-examples目錄)下出現了一個pkg目錄,pkg目錄下是一個名為linux_386的子目錄,其下面有一個文 件:hello.a。這就是我們install的結果。hello.go被編譯為hello.a并安裝到pkg/linux_386目錄下了。

.a這個后綴名讓我們想起了靜態共享庫,但這里的.a卻是Go獨有的文件格式,與傳統的靜態共享庫并不兼容。但Go語言的設計者使用這個后綴名似乎是希望 這個.a文件也承擔起Go語言中"靜態共享庫"的角色。我們不妨來試試,看看這個hello.a是否可以被Go compiler當作"靜態共享庫"來對待。我們移除src中的hello目錄,然后在main目錄下執行go build:

 

復制代碼代碼如下:

[root@localhost main]# go build   
main.go:4:8: import "hello": cannot find package  

 

Go編譯器提示無法找到hello這個包,可見目前版本的Go編譯器似乎不理pkg下的.a文件。http://code.google.com/p/go/issues/detail?id=2775 這個issue也印證了這一點,不過后續Go版本很可能會支持鏈接.a文件。畢竟我們在使用第三方package的時候,很可能無法得到其源碼,并且在每個項目中都保存一份第三方包的源碼也十分不利于項目源碼的后期維護。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久精品久久久久| 疯狂做受xxxx欧美肥白少妇| 亚洲美女av网站| 91国产在线精品| 欧美高清无遮挡| 美女精品视频一区| 久久精品国产2020观看福利| 日韩经典中文字幕| 日韩在线观看免费| 亚洲精品久久久久久久久| 亚洲毛片一区二区| 日韩视频精品在线| 国产精品电影一区| 亚洲品质视频自拍网| 精品丝袜一区二区三区| 久久久日本电影| 国产午夜精品理论片a级探花| 国产美女久久精品香蕉69| 日韩欧美中文字幕在线观看| 久久精品美女视频网站| 国产精品流白浆视频| 国产成人精品午夜| 韩国精品久久久999| 欧美精品电影在线| 欧美乱大交做爰xxxⅹ性3| 国产一区二区三区在线| www.美女亚洲精品| 久久久久久久国产精品| 色先锋资源久久综合5566| 日韩中文字在线| 91中文在线视频| 亚洲男人av电影| 国产精品视频yy9099| 欧美日韩裸体免费视频| 国产999精品久久久| 久久精品视频99| 伊人久久精品视频| 欧洲成人性视频| 在线亚洲午夜片av大片| 久久久欧美一区二区| 欧美日本中文字幕| 亚洲成人在线视频播放| 日韩乱码在线视频| 亚洲精品美女在线观看播放| 国外成人免费在线播放| 欧美日韩亚洲视频| 日本久久久久久久久久久| 国产一区二区成人| 亚洲综合在线做性| 黑丝美女久久久| 亚洲视频在线观看| 久久精品视频99| 麻豆乱码国产一区二区三区| 国产精品美女主播在线观看纯欲| yw.139尤物在线精品视频| 成人春色激情网| 亚洲精品一区中文字幕乱码| 精品丝袜一区二区三区| 最近2019年好看中文字幕视频| 成人免费网站在线看| 久久精品中文字幕电影| 韩国三级日本三级少妇99| 欧美激情精品久久久久久蜜臀| 欧美成人免费va影院高清| 国产精品一久久香蕉国产线看观看| 欧美自拍大量在线观看| 成人中文字幕+乱码+中文字幕| 久久精品成人欧美大片| 国产一区二区三区高清在线观看| 国产亚洲精品久久久优势| 91久久久国产精品| 日韩视频永久免费观看| 日韩精品极品毛片系列视频| 一本色道久久综合狠狠躁篇怎么玩| 日韩av电影免费观看高清| 日韩大陆欧美高清视频区| 欧美男插女视频| 欧美高清在线观看| 欧美激情亚洲精品| 欧美性猛交xxxx富婆弯腰| 成人欧美一区二区三区在线湿哒哒| 在线观看成人黄色| 色先锋资源久久综合5566| 亚洲人成77777在线观看网| 粗暴蹂躏中文一区二区三区| 亚洲大胆人体视频| 欧美成aaa人片在线观看蜜臀| 中文字幕日韩精品在线观看| 这里只有精品丝袜| 欧美色播在线播放| 亚洲天堂网站在线观看视频| 国产啪精品视频| 欧美精品在线看| 国产在线视频91| 亚洲丝袜av一区| 国产精彩精品视频| 亚洲国产精品99久久| 日本不卡高字幕在线2019| 欧美黑人巨大精品一区二区| 欧美性猛交xxxx富婆弯腰| 日韩av免费看| 欧美激情视频在线免费观看 欧美视频免费一| 国模叶桐国产精品一区| 国产欧美日韩最新| 久热爱精品视频线路一| 色香阁99久久精品久久久| 亚洲欧美在线免费观看| 日韩高清欧美高清| 国产一区二区香蕉| 亚洲国产精品女人久久久| 97香蕉久久超级碰碰高清版| 国产在线拍偷自揄拍精品| 97在线精品国自产拍中文| 在线视频日本亚洲性| 国产成人精品免高潮在线观看| 精品中文字幕在线观看| 成人黄色中文字幕| 国产精品久久999| 日韩亚洲欧美成人| 亚洲视频综合网| 亚洲欧美999| 久久夜色撩人精品| 欧美成人午夜免费视在线看片| 亚洲成人a**站| 91九色国产社区在线观看| 精品欧美aⅴ在线网站| 国产精品人人做人人爽| 成人在线播放av| 亚洲乱亚洲乱妇无码| 亚洲国产精品嫩草影院久久| 亚洲美女精品成人在线视频| 日本免费久久高清视频| 91精品国产综合久久香蕉| 成人信息集中地欧美| 一本色道久久综合狠狠躁篇怎么玩| 国产一区二中文字幕在线看| 精品无码久久久久久国产| 欧美日韩国产999| 亚州av一区二区| 欧美最猛性xxxxx免费| 亚洲视频在线免费看| 精品日韩视频在线观看| 国产成人av网| 精品久久久一区二区| 欧美成人激情图片网| 欧美激情精品久久久久久变态| 国产精品第一视频| 日本中文字幕成人| 欧美第一淫aaasss性| 久久99精品国产99久久6尤物| 国产精品久久在线观看| 国产日韩欧美中文在线播放| 国产精品久久久久久影视| 亚洲97在线观看| 精品久久久久久久久久| 欧美激情一级二级| 国产精品扒开腿做爽爽爽男男| 国产一区香蕉久久| 91最新国产视频| 国语对白做受69| 亚洲人成网站在线播| 国语自产精品视频在免费| 国产精品jvid在线观看蜜臀| 91在线无精精品一区二区|