golang入門(mén)

本文同步發(fā)表于我的博客,點(diǎn)此穿越

Go 基本介紹

Go發(fā)展

早在2007年9月,Go語(yǔ)言還是這幫大牛的20%自由時(shí)間的實(shí)驗(yàn)項(xiàng)目。 幸運(yùn)的是, 到了2008年5月 , Google發(fā)現(xiàn)了Go語(yǔ)言的巨大潛力, 從而開(kāi)始全力支持這個(gè)項(xiàng)目 , 讓這批人可以全身心投入Go語(yǔ)言的設(shè)計(jì)和開(kāi)發(fā)工作中。 Go語(yǔ)言的第一個(gè)版本在2009年11月正式對(duì)外發(fā)布,并在此后的兩年內(nèi)快速迭代,發(fā)展迅猛。 第一個(gè)正式版本的Go語(yǔ)言于2012年3月28 日正式發(fā)布, 讓Go語(yǔ)言迎來(lái)了第一個(gè)引人矚目的里程碑。截至現(xiàn)在,Go已經(jīng)更新到1.5版本,1.5正式版就在8月份中旬發(fā)布。
Go編程語(yǔ)言是一個(gè)使得程序員更加有效率的開(kāi)源項(xiàng)目。Go 是有表達(dá)力、簡(jiǎn)潔、清晰和有效率的。它的并行機(jī)制使其很容易編寫(xiě)多核和網(wǎng)絡(luò)應(yīng)用,而新奇的類(lèi)型系統(tǒng)允許構(gòu)建有彈性 的模塊化程序。Go 編譯到機(jī)器碼非??焖伲瑫r(shí)具有便利的垃圾回收和強(qiáng)大的運(yùn)行時(shí)反射。它是快速的、靜態(tài)類(lèi)型編譯語(yǔ)言,但是感覺(jué)上是動(dòng)態(tài)類(lèi)型的,解釋型語(yǔ)言。

Go語(yǔ)言最主要的特性:

  • 自動(dòng)垃圾回收
  • 更豐富的內(nèi)置類(lèi)型
  • 函數(shù)多返回值
  • 錯(cuò)誤處理
  • 匿名函數(shù)和閉包
  • 類(lèi)型和接口
  • 并發(fā)編程
  • 反射
  • 語(yǔ)言交互性

開(kāi)發(fā)環(huán)境配置

請(qǐng)參見(jiàn)另一篇博客Golang 環(huán)境搭建


下面切入正題,介紹Go語(yǔ)言編程,由于只是本篇只是一個(gè)快速了解Go,所以有些內(nèi)容會(huì)略微一提,如果讀者用到或者要深入了解,可自行找文檔參考,這里有個(gè)印象即可。

Go 編程基礎(chǔ)

基礎(chǔ)數(shù)據(jù)類(lèi)型

  • 布爾類(lèi)型:bool
  • 整數(shù)類(lèi)型:int8 uint8 int16 uint16 int32 uint32 int64 uint64 int rune byte complex128 complex64,其中,byteint8 的別名
  • 浮點(diǎn)類(lèi)型:float32 float64
  • 字符串類(lèi)型:string
  • 字符類(lèi)型: rune,是 int32 的別名
  • 空: nil
  • 萬(wàn)能類(lèi)型: interface{}

操作符

+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^= ->

內(nèi)置函數(shù)

  • len:計(jì)算(字符串,數(shù)組或者切片,map)長(zhǎng)度
  • cap:計(jì)算(數(shù)組或者切片,map)容量
  • close:關(guān)閉通道
  • append:追加內(nèi)容到切片
  • copy:拷貝數(shù)組/切片內(nèi)容到另一個(gè)數(shù)組/切片
  • delete:用于刪除map的元素

變量的定義和賦值

  1. 先定義,后賦值。變量的定義要用var 關(guān)鍵字聲明,如,var str string,這就定義了一個(gè)名字為“str”的string類(lèi)型的變量;(有過(guò)其他編程語(yǔ)言經(jīng)驗(yàn)的讀者可能會(huì)有點(diǎn)不適應(yīng),不過(guò)沒(méi)錯(cuò),Go的變量類(lèi)型就是放在變量后面的。)還可以一次定義多個(gè)變量,如 var a string, b int;這樣就同時(shí)定義了一個(gè)字符串類(lèi)型和一個(gè)int類(lèi)型的變量;如果幾個(gè)連續(xù)的變量是同樣的類(lèi)型,可以一次性在最后該類(lèi)型變量后說(shuō)明,不需要單個(gè)說(shuō)明。var a, b, c string, int d。也可以多行分別定義,如:

    var a string 
    var b string
    var c int
    

這種寫(xiě)法要重復(fù)寫(xiě)var這個(gè)關(guān)鍵字,其實(shí)這種寫(xiě)法是可以只寫(xiě)一個(gè)var的,等價(jià)于下面的寫(xiě)法:

``` go
var (
    a, b string
    c int
)
```
  1. 變量的賦值
    var a string,定義一個(gè)string類(lèi)型的a變量,然后a = "this is a string"就可以把字符串的值賦給a了。這里有個(gè)簡(jiǎn)便的寫(xiě)法,就是聲明和賦值同時(shí)進(jìn)行,以上兩句等同于var a string = "this is a string",這種寫(xiě)法大多數(shù)語(yǔ)言都是類(lèi)似的.由于Go可以根據(jù)變量的值自動(dòng)推斷該變量的數(shù)據(jù)類(lèi)型,所以還等價(jià)于var a = "this is a string";另外Go中還有個(gè)更為簡(jiǎn)潔的寫(xiě)法,等同于a := "this is a string",直接省略關(guān)鍵字var,取而代之的是一個(gè)操作符:=,這個(gè)操作符的作用就是聲明并賦值。
  2. 常量的定義和賦值
    常量用關(guān)鍵詞const說(shuō)明,并且常量的值是在定義的時(shí)候一次性賦值的,如定義一個(gè)字符串常量,const CONST_STR = "const string"等價(jià)于const CONST_STR string = "const string"。
  3. *注意
    const,var:=不可同時(shí)使用。

函數(shù)

函數(shù)的結(jié)構(gòu)如下 func func_name([param_name type][...]) [return_value type[...]]。
以關(guān)鍵字func開(kāi)頭, 后面是函數(shù)名, 函數(shù)名后面是函數(shù)參數(shù),參數(shù)個(gè)數(shù)大于等于0個(gè),參數(shù)后面是返回值,返回值個(gè)數(shù)>=0,也就是說(shuō),Go語(yǔ)言支持多返回值。
其中g(shù)o中有個(gè)特殊的函數(shù)(其實(shí)還有一個(gè)init函數(shù),但是作為入門(mén)篇,不在這里介紹了),那就是main函數(shù),main函數(shù)是無(wú)參,無(wú)返回值,名字是main的一個(gè)特殊函數(shù),它是程序的入口,并且main函數(shù)只能定義在mian的包(下面有介紹)中。

如果您是Java開(kāi)發(fā)者,想必對(duì)包的概念并不陌生。在Go語(yǔ)言中,如果開(kāi)發(fā)中有來(lái)自不同庫(kù)的同名的函數(shù),該如何處理,這就要依靠package來(lái)區(qū)分,也就是說(shuō)包的作用類(lèi)似于作用于,是對(duì)函數(shù),變量等作用范圍的一種約束。

包的定義

包的定義是通過(guò) package這個(gè)關(guān)鍵字來(lái)說(shuō)明的,一般寫(xiě)在文件的最上方。如package a,則定義了一個(gè)名字為a的包。包的名字只允許有一級(jí)目錄,即不允許類(lèi)似java的com.example.a或者com/example/a這樣的多層級(jí)定義。一般來(lái)說(shuō),包的名字最好和其父目錄的名字一致,這樣在使用包和包里的內(nèi)容時(shí)會(huì)比較容易理解(另會(huì)有文章說(shuō)明)。

包的使用

包的導(dǎo)入使用關(guān)鍵字import來(lái)聲明,如要在其他包中導(dǎo)入上面定義的包a,則聲明如下:import "a",如果多個(gè),可以類(lèi)似定義變量:

import (
    "a"
    "b"
)

函數(shù)和變量(常量)導(dǎo)出規(guī)則

Go語(yǔ)言中,拋棄了類(lèi)似C++和Java中的private,public,protected,或者是friendld的可見(jiàn)性定義,采取了極簡(jiǎn)方式。如果變量或者函數(shù)首字母大寫(xiě),代表可以導(dǎo)出,即對(duì)其他包是可見(jiàn)的,否則是不可見(jiàn)的。

到這里,Go的基本概念已經(jīng)基本講清楚,下面用一個(gè)示例說(shuō)明上面的概念。

  1. 創(chuàng)建一個(gè)文件夾,名字假設(shè)叫做 example

  2. 進(jìn)入example,創(chuàng)建文件main.go,并添加以下內(nèi)容:

    package main //因?yàn)檫@里有程序的入口,main方法存在,所以包名必須命名為main
    
    // 這里導(dǎo)入要使用的包
    import (
        "./number" //這里導(dǎo)入我們自己定義的包,“./”是說(shuō)用相對(duì)路徑的方式導(dǎo)入包
        "fmt" //fmt是go標(biāo)準(zhǔn)包,用于處理輸入輸出
    )
    
    //這是程序的主函數(shù),寫(xiě)法就是這樣固定的,無(wú)參,無(wú)返回值
    func main() {
        //調(diào)用我們的函數(shù)并把產(chǎn)生的結(jié)果賦值給定義的max和min變量,根據(jù)GetMaxAndMin的返回值類(lèi)型,go自動(dòng)推斷出max和min的是int類(lèi)型
        max, min := number.GetMaxAndMin(1, 3, 4, 2, 6, 0, 8)
    
        //調(diào)用格式話輸出打印max和min
        fmt.Printf("max:%v, min:%v\n", max, min)
    }
    
  3. 創(chuàng)建文件numbner.go,并添加如下內(nèi)容:

    // 這里可以添加注釋?zhuān)@是單行注釋
    
    /*
        這里也是注釋?zhuān)?    是多行注釋?zhuān)?    允許注釋跨行
    */
    package number// 這是包名,除了文件的注釋?zhuān)话惆旁谧钌戏?
    // 這里定義一個(gè)函數(shù),用來(lái)獲取values參數(shù)中的最大值和最小值。
    // 函數(shù)名GetMaxAndMin大寫(xiě)代表其他包可見(jiàn),如果是小寫(xiě),則其他包不可引用該函數(shù)
    // (a, b int, values ...int),a,b, values都是該函的參數(shù),a,b是必填的參數(shù),
    // ...代表values是變參,即長(zhǎng)度不固定,個(gè)數(shù)>=0,并且都是int類(lèi)型
    // (int, int)代表該函數(shù)有兩個(gè)返回值,都是int類(lèi)型
    func GetMaxAndMin(a, b int, values ...int) (int, int) {
        max, min := a, a //定義并賦值兩個(gè)變量 max,min,并把a(bǔ)的值賦給max和min
        if a<b { //go允許簡(jiǎn)單條件和控制語(yǔ)句之間不加小括號(hào),并且大括號(hào)左部分必須和條件在同一行
            max = b
        } else {
            min = b
        }
    
        // 這里是for循環(huán),在go中for是非常給力的循環(huán)控制器,沒(méi)有其他方式(不推薦用goto)
        // _ 的作用是說(shuō)把遍歷values產(chǎn)生的下標(biāo)的值忽略掉,v是產(chǎn)生的values的值,
        // range 關(guān)鍵詞 用來(lái)配合for,構(gòu)成一個(gè)簡(jiǎn)單的循環(huán)結(jié)構(gòu),相當(dāng)于for-each
        // 關(guān)于 “_”,因?yàn)間o中不允許有多余的為使用的參數(shù)和為使用的包,所以“_”就充當(dāng)了一個(gè)垃圾桶的角色,多返回值產(chǎn)生的不必要值可以填入“_”,
        // 從而達(dá)到控制編譯器編譯過(guò)程中不會(huì)報(bào)錯(cuò)。
        for _, v := range values {
            if v>a {
                max = v
            }
    
            if v<b {
                min = v
            }
        }
    
        return max, min
    }
    
    

注意,文件保存編碼是utf-8 。
打開(kāi)終端(命令行工具),切換到example目錄下,執(zhí)行go run main.go,可以看到有內(nèi)容輸出:

max:8, min:0

附Go命令

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容