Go 基礎(chǔ)知識(shí)一

Go內(nèi)置關(guān)鍵字(25個(gè)均為小寫)

break        default           func        interface        select
case          defer              go           map               struct
chan          else                goto       package        switch
const         fallthrough    if             range             type
continue   for                  import    return             var 

Go注釋方法

// :?jiǎn)涡凶⑨?/* */:多行注釋

Go程序的一般結(jié)構(gòu):見代碼

Go程序是通過 package 來組織的(與python類似)
只有 package 名稱為 main 的包可以包含 main 函數(shù)
一個(gè)可執(zhí)行程序 有且僅有 一個(gè) main 包

通過 import 關(guān)鍵字來導(dǎo)入其它非 main 包
通過 const 關(guān)鍵字來進(jìn)行常量的定義
通過在函數(shù)體外部使用 var 關(guān)鍵字來進(jìn)行全局變量的聲明與賦值
通過 type 關(guān)鍵字來進(jìn)行結(jié)構(gòu)(struct)或接口(interface)的聲明
通過 func 關(guān)鍵字來進(jìn)行函數(shù)的聲明




代碼示例

//當(dāng)前程序的包名
package main

//導(dǎo)入其它的包
import (
    std "fmt"
)

//常量的定義
const (
    PI = 3.14
)

//全局變量的聲明和賦值
var (
    name = "song"
)

//一般類型的聲明
type newType int

//結(jié)構(gòu)的聲明
type song struct{}

//接口的聲明
type steven interface{}

//由main 函數(shù)作為程序入口點(diǎn)啟動(dòng)

func main() {
    std.Println("hello word")
}

Go基本類型

布爾型:bool

- 長(zhǎng)度:1字節(jié)
- 取值范圍:true, false
- 注意事項(xiàng):不可以用數(shù)字代表true或false

整型:int/uint

- 根據(jù)運(yùn)行平臺(tái)可能為32或64位

8位整型:int8/uint8

- 長(zhǎng)度:1字節(jié)
- 取值范圍:-128~127/0~255

字節(jié)型:byte(uint8別名)

16位整型:int16/uint16

- 長(zhǎng)度:2字節(jié)
- 取值范圍:-32768~32767/0~65535

32位整型:int32(rune)/uint32

- 長(zhǎng)度:4字節(jié)
- 取值范圍:-2^32/2~2^32/2-1/0~2^32-1

64位整型:int64/uint64

- 長(zhǎng)度:8字節(jié)
- 取值范圍:-2^64/2~2^64/2-1/0~2^64-1

浮點(diǎn)型:float32/float64

- 長(zhǎng)度:4/8字節(jié)
- 小數(shù)位:精確到7/15小數(shù)位

復(fù)數(shù):complex64/complex128

- 長(zhǎng)度:8/16字節(jié)

足夠保存指針的 32 位或 64 位整數(shù)型:uintptr

其它值類型:

- array、struct、string

引用類型:

- slice、map、chan

接口類型:inteface

函數(shù)類型:func

類型零值

零值并不等于空值,而是當(dāng)變量被聲明為某種類型后的默認(rèn)值,通常情況下值類型的默認(rèn)值為0,bool為false,string為空字符串

單個(gè)變量的聲明與賦值

:=是聲明并賦值,并且系統(tǒng)自動(dòng)推斷類型,不需要var關(guān)鍵字

- 變量的聲明格式:var <變量名稱> <變量類型>
- 變量的賦值格式:<變量名稱> = <表達(dá)式>
- 聲明的同時(shí)賦值:var <變量名稱> [變量類型] = <表達(dá)式>

多個(gè)變量的聲明與賦值

- 全局變量的聲明可使用 var() 的方式進(jìn)行簡(jiǎn)寫
- 全局變量的聲明不可以省略 var,但可使用并行方式
- 所有變量都可以使用類型推斷
- 局部變量不可以使用 var() 的方式簡(jiǎn)寫,只能使用并行方式

變量的類型轉(zhuǎn)換

Go中不存在隱式轉(zhuǎn)換,所有類型轉(zhuǎn)換必須顯式聲明
轉(zhuǎn)換只能發(fā)生在兩種相互兼容的類型之間
類型轉(zhuǎn)換的格式:
    <ValueA> [:]= <TypeOfValueA>(<ValueB>)

常量的初始化規(guī)則與枚舉

-在定義常量組時(shí),如果不提供初始值,則表示將使用上行的表達(dá)式
-使用相同的表達(dá)式不代表具有相同的值
-iota是常量的計(jì)數(shù)器,從0開始,組中每定義1個(gè)常量自動(dòng)遞增1
-通過初始化規(guī)則與iota可以達(dá)到枚舉的效果
-每遇到一個(gè)const關(guān)鍵字,iota就會(huì)重置為0

運(yùn)算符

Go中的運(yùn)算符均是從左至右結(jié)合

優(yōu)先級(jí)(從高到低)
^ () ! (取反 ) (一元運(yùn)算符)
* (乘) / (除) % (取余) <<(二進(jìn)制左移) >> (二進(jìn)制右移) & &^
+ - | ^ (二元運(yùn)算符)
== != < <= >= >
<- (專門用于channel)
&&
||

示例

/*
  6:0110
 11:1011
----------
& 與 0010 (兩個(gè)是1才是1,其它是0)
| 或 1111 (有一個(gè)是1就是1)
^    1101 (兩個(gè)當(dāng)中只能有一個(gè)為1)
&^   0100  (第二個(gè)運(yùn)算值是1的話,第一個(gè)強(qiáng)制為0,結(jié)果為0)

*/

func main() {

    fmt.Println(6 & 11)
    fmt.Println(6 | 11)
    fmt.Println(6 ^ 11)
    fmt.Println(6 &^ 11)

}

計(jì)算機(jī)存儲(chǔ)單位

package main

import (
    "fmt"
)

const (
    _          = iota
    KB float64 = 1 << (iota * 10)
    MB
    GB
    TB
    PB
    EB
    ZB
    YB
)

func main() {
    fmt.Println(KB)
    fmt.Println(MB)
    fmt.Println(GB)
    fmt.Println(TB)
    fmt.Println(PB)
    fmt.Println(EB)
    fmt.Println(ZB)
    fmt.Println(YB)

}

指針

Go雖然保留了指針,但與其它編程語言不同的是,在Go當(dāng)中不支持指針運(yùn)算以及”->”運(yùn)算符,
而直接采用”.”選擇符來操作指針目標(biāo)對(duì)象的成員操作符”&”取變量地址,
使用”*”通過指針間接訪問目標(biāo)對(duì)象默認(rèn)值為 nil 而非 NULL

package main
import (
    "fmt"
)
func main() {
    a := 1
    var b *int = &a
    fmt.Println(b)//指向b的內(nèi)存地址
    fmt.Println(*b)//最出b的值
}

遞增遞減語句

    在Go當(dāng)中,++ 與 -- 是作為語句而并不是作為表達(dá)式  如:a++ 不能放在 = 的右側(cè),只能單獨(dú)用

判斷語句if

條件表達(dá)式?jīng)]有括號(hào)
支持一個(gè)初始化表達(dá)式(可以是并行方式)
左大括號(hào)必須和條件語句或else在同一行
支持單行模式
初始化語句中的變量為block級(jí)別,同時(shí)隱藏外部同名變量
1.0.3版本中的編譯器BUG


package main

import (
    "fmt"
)

func main() {
    a := 10
    if a, b := 1, 5; a > 0 {
        fmt.Println(a)
        fmt.Println(b)
    }
    fmt.Println(a)

}

循環(huán)語句for

Go只有for一個(gè)循環(huán)語句關(guān)鍵字,但支持3種形式
初始化和步進(jìn)表達(dá)式可以是多個(gè)值
條件語句每次循環(huán)都會(huì)被重新檢查,因此不建議在條件語句中
使用函數(shù),盡量提前計(jì)算好條件并以變量或常量代替
左大括號(hào)必須和條件語句在同一行


選擇語句switch

可以使用任何類型或表達(dá)式作為條件語句
不需要寫break,一旦條件符合自動(dòng)終止
如希望繼續(xù)執(zhí)行下一個(gè)case,需使用fallthrough語句
支持一個(gè)初始化表達(dá)式(可以是并行方式),右側(cè)需跟分號(hào)
左大括號(hào)必須和條件語句在同一行

跳轉(zhuǎn)語句goto, break, continue

三個(gè)語法都可以配合標(biāo)簽使用
標(biāo)簽名區(qū)分大小寫,若不使用會(huì)造成編譯錯(cuò)誤
Break與continue配合標(biāo)簽可用于多層循環(huán)的跳出
Goto是調(diào)整執(zhí)行位置,與其它2個(gè)語句配合標(biāo)簽的結(jié)果并不相同


數(shù)組Array

定義數(shù)組的格式:var <varName> [n]<type>,n>=0
數(shù)組長(zhǎng)度也是類型的一部分,因此具有不同長(zhǎng)度的數(shù)組為不同類型
注意區(qū)分指向數(shù)組的指針和指針數(shù)組
數(shù)組在Go中為值類型
數(shù)組之間可以使用==或!=進(jìn)行比較,但不可以使用<或>
可以使用new來創(chuàng)建數(shù)組,此方法返回一個(gè)指向數(shù)組的指針
Go支持多維數(shù)組

Go語言版冒泡排序

定義數(shù)組的格式:var <varName> [n]<type>,n>=0
數(shù)組長(zhǎng)度也是類型的一部分,因此具有不同長(zhǎng)度的數(shù)組為不同類型
注意區(qū)分指向數(shù)組的指針和指針數(shù)組
數(shù)組在Go中為值類型
數(shù)組之間可以使用==或!=進(jìn)行比較,但不可以使用<或>
可以使用new來創(chuàng)建數(shù)組,此方法返回一個(gè)指向數(shù)組的指針
Go支持多維數(shù)組

Go語言版冒泡排序

package main

import (
    "fmt"
)

func main() {
    a := [...]int{4, 2, 6, 8, 1, 9, 10}

    num := len(a)

    for i := 0; i < num; i++ {
        for j := i + 1; j < num; j++ {
            if a[i] < a[j] {
                temp := a[i]
                a[i] = a[j]
                a[j] = temp
            }
        }
    }
    fmt.Println(a)
}
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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