最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

創(chuàng)建第一個(gè)Go語言程序Hello,Go!

 更新時(shí)間:2014年10月28日 09:07:49   投稿:junjie  
這篇文章主要介紹了創(chuàng)建第一個(gè)Go語言程序Hello,Go!本文詳細(xì)的給出項(xiàng)目創(chuàng)建、代碼編寫的過程,同時(shí)講解了GOPATH、Go install等內(nèi)容,需要的朋友可以參考下

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

一、在go-examples下創(chuàng)建一個(gè)文件hello.go

復(fù)制代碼 代碼如下:

//hello.go  
package main

import "fmt"http://實(shí)現(xiàn)格式化的I/O 
 
/*Printf someting*/ 
func main(){  
       fmt.Printf("Hello,GO!\n")  
}

我們來分析下這個(gè)程序:

1、程序中的第2行這個(gè)是必須的。所有的Go文件以package <something>開頭,對于獨(dú)立運(yùn)行的執(zhí)行文件必須是package main;

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

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

4、package main 必須首先出現(xiàn),緊跟著是import。在Go中,package 總是首先出現(xiàn),然后是import,然后是其他所有內(nèi)容。當(dāng)Go 程序在執(zhí)行的時(shí)候,首先調(diào)用的函數(shù)是main.main(),這是從C 中繼承而來。這里定義了這個(gè)函數(shù);

5、第8行調(diào)用了來自于fmt包的函數(shù)打印字符串到屏幕

二、編譯和運(yùn)行代碼

編譯該源文件并執(zhí)行生成的可執(zhí)行文件

復(fù)制代碼 代碼如下:

[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源文件名,我們即可得到一個(gè)可執(zhí)行文件,默認(rèn)情況下這個(gè)文件的名字為源文件名字去掉.go后綴。當(dāng)然我們也可以通過-o選項(xiàng)來指定其他名字:

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

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

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

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

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

四、GOPATH

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

復(fù)制代碼 代碼如下:

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

復(fù)制代碼 代碼如下:

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

用go build編譯main.go 結(jié)果如下

復(fù)制代碼 代碼如下:

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

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

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

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

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

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

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

復(fù)制代碼 代碼如下:

[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中,這樣這個(gè)demo project顯得更加合理,所有源碼均在src下:

復(fù)制代碼 代碼如下:

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

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

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

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

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

* go install將可執(zhí)行文件安裝到與src同級別的bin目錄下,bin目錄由go install自動(dòng)創(chuàng)建

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

現(xiàn)在我們來看看bin目錄:

復(fù)制代碼 代碼如下:

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

的確出現(xiàn)一個(gè)bin目錄,并且剛剛編譯的程序main在bin下面。

hello.go編譯后并非可執(zhí)行程序,在編譯main的同時(shí),由于main依賴hello package,因此hello也被關(guān)聯(lián)編譯了。這與單獨(dú)在hello目錄下執(zhí)行install的結(jié)果是一樣的,我們試試:

復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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

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

相關(guān)文章

  • 搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)

    搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)

    很多朋友不知道如何使用Goland軟件,搭建一個(gè)ORM框架GORM,今天小編給大家分享一篇教程關(guān)于搭建Go語言的ORM框架Gorm的具體步驟(從Java到go),感興趣的朋友跟隨小編一起學(xué)習(xí)下吧
    2022-09-09
  • Go切片的具體使用

    Go切片的具體使用

    本文主要介紹了Go切片的具體使用,包括聲明切片、初始化切片、切片的切割、切片的添加、切片的刪除、切片的復(fù)制、切片的遍歷、多維切片等,感興趣的可以了解一下
    2023-11-11
  • Go語言中定時(shí)器cron的基本使用教程

    Go語言中定時(shí)器cron的基本使用教程

    這篇文章主要給大家介紹了關(guān)于Go語言中定時(shí)器cron使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Go語言中Goroutine的設(shè)置方式

    Go語言中Goroutine的設(shè)置方式

    這篇文章介紹了Go語言中Goroutine的設(shè)置方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • golang獲取當(dāng)前時(shí)間、時(shí)間戳和時(shí)間字符串及它們之間的相互轉(zhuǎn)換方法

    golang獲取當(dāng)前時(shí)間、時(shí)間戳和時(shí)間字符串及它們之間的相互轉(zhuǎn)換方法

    這篇文章主要介紹了golang獲取當(dāng)前時(shí)間、時(shí)間戳和時(shí)間字符串及它們之間的相互轉(zhuǎn)換,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-04-04
  • 利用GO語言實(shí)現(xiàn)多人聊天室實(shí)例教程

    利用GO語言實(shí)現(xiàn)多人聊天室實(shí)例教程

    聊天室的實(shí)現(xiàn)大家應(yīng)該都遇到過,這篇文章主要給大家介紹了關(guān)于利用GO語言實(shí)現(xiàn)多人聊天室的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2018-03-03
  • 通過源碼分析Golang?cron的實(shí)現(xiàn)原理

    通過源碼分析Golang?cron的實(shí)現(xiàn)原理

    golang實(shí)現(xiàn)定時(shí)任務(wù)很簡單,只須要簡單幾步代碼即可以完成,最近在做了幾個(gè)定時(shí)任務(wù),想研究一下它內(nèi)部是怎么實(shí)現(xiàn)的,所以將源碼過了一遍,記錄和分享在此。需要的朋友可以參考以下內(nèi)容,希望對大家有幫助
    2022-10-10
  • 學(xué)習(xí)使用Go反射的用法示例

    學(xué)習(xí)使用Go反射的用法示例

    這篇文章主要介紹了學(xué)習(xí)使用Go反射的用法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 詳解go 動(dòng)態(tài)數(shù)組 二維動(dòng)態(tài)數(shù)組

    詳解go 動(dòng)態(tài)數(shù)組 二維動(dòng)態(tài)數(shù)組

    這篇文章主要介紹了go 動(dòng)態(tài)數(shù)組 二維動(dòng)態(tài)數(shù)組,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • golang連接kafka的示例代碼

    golang連接kafka的示例代碼

    本文主要介紹了golang連接kafka的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論

青河县| 平定县| 永丰县| 宁津县| 迁西县| 林甸县| 寿宁县| 伊川县| 维西| 宁津县| 商洛市| 无锡市| 上杭县| 宜兴市| 繁昌县| 钟山县| 宝兴县| 白河县| 南部县| 蓬安县| 廉江市| 灌南县| 台湾省| 静宁县| 西畴县| 延边| 大英县| 南乐县| 翼城县| 迭部县| 奉节县| 英德市| 巨鹿县| 宾阳县| 柏乡县| 海南省| 鄂托克前旗| 丰县| 荃湾区| 金溪县| 南华县|