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

一文詳解Golang中的基礎(chǔ)語(yǔ)法

 更新時(shí)間:2023年03月07日 08:24:00   作者:Juno3550  
這篇文章主要為大家詳細(xì)介紹了Golang中基礎(chǔ)語(yǔ)法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Golang有一定的幫助,感興趣的可以了解一下

導(dǎo)包

示例:工程結(jié)構(gòu)如下

GOPATH 設(shè)置為工程根目錄(E:\GO_PROJECT)

test1.go

package package_test

import "fmt"

/*
定義函數(shù)
*/
func Func1() {
    fmt.Println("test1 func1")
}

test2.go

package package_test

import "fmt"

func Func2() {
    fmt.Println("test2 func2")
}

testmain.go

package main

import "dir1/dir2"  // 導(dǎo)入的是【目錄名】

func main() {
    package_test.Func1()  // 調(diào)用的是【包名】
}

運(yùn)行:

// 方式一
go bulid testmain.go  // 編譯(生成可執(zhí)行文件)
./ testmain  // 運(yùn)行(可執(zhí)行文件)

//方式二
go run testmain.go  // 編譯+運(yùn)行

導(dǎo)包結(jié)論:

一個(gè) GO 程序中一定要有 main 包和 main 函數(shù),這是 GO 程序執(zhí)行的入口。

編譯器會(huì)根據(jù)指定的相對(duì)路徑去搜索包然后導(dǎo)入,這個(gè)相對(duì)路徑是從 GOROOT 或 GOPATH(workspace)下的 src 下開(kāi)始搜索:

  • GOROOT
  • 項(xiàng)目 GOPATH
  • 全局 GOPATH

GOlang 和 Java 的區(qū)別是,在 GO 中 import 的是目錄,而不是包名;并且 GO 沒(méi)有強(qiáng)制要求包名和目錄名需要一致,即包和目錄是兩個(gè)不同的概念。

import 導(dǎo)入的是源文件所在的目錄名,而不是定義的包名。

在代碼中引用包內(nèi)的成員時(shí),使用定義的包名而不是目錄名。

在習(xí)慣上將包名和目錄名保證一致,但這并不是強(qiáng)制規(guī)定。

在同一級(jí)目錄中,所有源文件只能使用相同的包名。

同一包名下的變量名、函數(shù)名等不能重復(fù)。

多個(gè)目錄下的相同包名,彼此無(wú)關(guān)。

包中的成員(如函數(shù))以名稱(chēng)?字母??寫(xiě),決定其訪問(wèn)權(quán)限:

  • ?字母?寫(xiě),可被包外訪問(wèn)(即public
  • ?字母?寫(xiě),僅包內(nèi)成員可以訪問(wèn)(即private

工程管理

為了更好的管理項(xiàng)目中的文件,GO 要求將文件都要放在相應(yīng)的目錄中,具體規(guī)定了以下目錄:

  • src 目錄:以代碼包的形式組織并保存 GO 源碼文件(比如 .go 文件、.c 文件、.h 文件、.s 文件等)
  • pkg 目錄:用于存放經(jīng)由 go install 命令構(gòu)建安裝后的代碼包(包含 GO 庫(kù)源碼文件)的 ".a" 歸檔文件。
  • bin 目錄:與 pkg 目錄類(lèi)似,在通過(guò) go install 命令完成安裝后,保存由 GO 命令源碼文件生成的可執(zhí)行文件。

以上目錄稱(chēng)為工作區(qū)(Workspace),工作區(qū)其實(shí)就是一個(gè)對(duì)應(yīng)于特定工程的目錄。

src 目錄用于包含所有的源代碼,是 GO 命令行工具一個(gè)強(qiáng)制的規(guī)則;而 pkg 和 bin 則無(wú)需手動(dòng)創(chuàng)建,GO 命令行工具在構(gòu)建過(guò)程中會(huì)自動(dòng)創(chuàng)建這些目錄。

變量

變量聲明

  • 變量名必須以字母或下劃線開(kāi)頭,后面可以跟任意數(shù)量的字母、數(shù)字或下劃線。
  • 變量的三種聲明&初始化方式如下:
// 方式一:先聲明(有默認(rèn)值),后賦值
var a int
a = 10
var b, c string
b = "b"
c = "c"

// 方式二:聲明+賦值
var a int = 10

// 方式三:自動(dòng)推導(dǎo)類(lèi)型(注意:這種方式只能在函數(shù)內(nèi)使用)
a := 10
b, c := 11, 12
b, c = c, b  // 值交換

// 匿名變量
_, i, _, j = 1, 2, 3, 4

格式化輸出

格式含義
%%一個(gè) % 字面量
%b一個(gè)二進(jìn)制整數(shù)值(基數(shù)為 2),或者是一個(gè)(高級(jí)的)用科學(xué)計(jì)數(shù)法表示的指數(shù)為 2 的浮點(diǎn)數(shù)
%c字符型??梢园演斎氲臄?shù)字按照 ASCII 碼相應(yīng)轉(zhuǎn)換為對(duì)應(yīng)的字符
%d一個(gè)十進(jìn)制數(shù)值(基數(shù)為 10)
%f以標(biāo)準(zhǔn)記數(shù)法表示的浮點(diǎn)數(shù)或者復(fù)數(shù)值
%o一個(gè)以八進(jìn)制表示的數(shù)字(基數(shù)為8)
%p以十六進(jìn)制(基數(shù)為 16)表示的一個(gè)值的地址,前綴為 0x,字母使用小寫(xiě)的 a-f 表示
%q使用 GO 語(yǔ)法以及必須時(shí)使用轉(zhuǎn)義,以雙引號(hào)括起來(lái)的字符串或者字節(jié)切片 []byte,或者是以單引號(hào)括起來(lái)的數(shù)字
%s字符串。輸出字符串中的字符直至字符串中的空字符(字符串以 '\0' 結(jié)尾,這個(gè) '\0' 即空字符)
%t以 true 或者 false 輸出的布爾值
%T使用 GO 語(yǔ)法輸出的值的類(lèi)型
%x以十六進(jìn)制表示的整型值(基數(shù)為十六),數(shù)字 a-f 使用小寫(xiě)表示
%X以十六進(jìn)制表示的整型值(基數(shù)為十六),數(shù)字 A-F 使用小寫(xiě)表示

基本數(shù)據(jù)類(lèi)型

類(lèi)型名稱(chēng)長(zhǎng)度零值(默認(rèn)值)說(shuō)明
bool布爾類(lèi)型1false其值不為真即為假,不可以用數(shù)字代表 true 或 false
byte字節(jié)型10uint8 的別名
int, uint整型-0有符號(hào) 32 位或無(wú)符號(hào) 64 位
int8整型10-128 ~ 127
uint8整型100 ~ 255
int16整型20-32768 ~ 32767
uint16整型200 ~ 65535
int32整型40-2147483648 到 2147483647
rune整型40int32 的別名
uint32整型400 到 4294967295(42 億)
int64整型80-9223372036854775808到 92233720368547758070
uint64整型80到 18446744073709551615(1844 京)
float32浮點(diǎn)型40.0小數(shù)位精確到 7 位
float64浮點(diǎn)型80.0小數(shù)位精確到 15 位
string字符串-""utf-8 字符串

值的字面量(literal)是指代碼中值的文字表示。一個(gè)值可能存在多種字面量表示。

表示基本類(lèi)型值的文本稱(chēng)為基本字面量。基本字面量也被稱(chēng)為字面量常量或未命名常量。

示例:

func main() {
    var ch byte = 97  // 聲明字符類(lèi)型
    fmt.Printf("ch=%c", ch)  //  輸出 a
}

這里定義了 ch 是一個(gè)字符類(lèi)型,賦值卻是一個(gè)整數(shù) 97,打印的結(jié)果是小寫(xiě)字符 'a'。

原因是:計(jì)算機(jī)不能直接存儲(chǔ)字符類(lèi)型,只能轉(zhuǎn)成數(shù)字存儲(chǔ),那為什么小寫(xiě)字符 'a' 對(duì)應(yīng)的整數(shù)是 97 呢?因?yàn)橛?jì)算機(jī)是根據(jù) ASCII 碼來(lái)存儲(chǔ)的。

強(qiáng)制類(lèi)型轉(zhuǎn)換

package main

import "fmt"

func main() {

    chinese := 97
    math := 99
    english := 96

    fmt.Printf("總分是 %d,平均分(整數(shù))是 %d, 平均分(浮點(diǎn)數(shù))是 %f", chinese+math+english, (chinese+math+english)/3, float32(chinese+math+english)/3)
    // 總分是 292,平均分(整數(shù))是 97, 平均分(浮點(diǎn)數(shù))是 97.333336
}

注意:

GO 語(yǔ)言中不允許隱式轉(zhuǎn)換,所有類(lèi)型轉(zhuǎn)換必須顯式聲明(強(qiáng)制轉(zhuǎn)換),而且轉(zhuǎn)換只能發(fā)生在兩種相互兼容的類(lèi)型之間

    var ch byte = 'c'
    // var a int = ch  // cannot use ch (type byte) as type int in assignment
    var b int = int(ch)  // 數(shù)據(jù)類(lèi)型名(待轉(zhuǎn)換的值)
  • int 轉(zhuǎn) float 強(qiáng)制轉(zhuǎn)換:多小數(shù)
  • float 轉(zhuǎn) int 強(qiáng)制轉(zhuǎn)換:丟精度

接收鍵盤(pán)輸入

package main

import fmt

func main() {
    var age int
    fmt.Println("請(qǐng)輸入年齡:")
    fmt.Scanf("%d", &age)  // 將接收的值賦給age變量
    fmt.Printf("age=%d", age)
}

常量

常量聲明

func main() {
    // 變量:程序運(yùn)行期間,值可以改變,聲明使用var
    // 常量:程序運(yùn)行期間,值不可以改變,聲明使用const
    const a int = 11
    // a = 12  // error:常量不可以修改
    
    const b = 12 // 自動(dòng)推導(dǎo)類(lèi)型(常量不可以使用:=)
}

iota 枚舉

iota 常量生成器:用于生成一組遞增的整型常量,減去了每行都要寫(xiě)一遍初始化表達(dá)式的繁瑣。

func main() {

    // 在一個(gè) const 聲明語(yǔ)句中,在第一個(gè)聲明的常量所在的行,iota 將會(huì)被置為 0,然后在每一個(gè)有常量聲明的行遞增 1
    const (
        a = iota  // 0
        b = iota  // 1
        c = iota  // 2
    )

    const d = iota // iota 遇到const,會(huì)被置為 0

    // 可以只寫(xiě)一個(gè)iota
    const (
        e = iota  // 0
        f // 1
        g
    )

    // 同一行值一樣
    const (
        h = iota  // 0
        i, j, k = iota, iota, iota  // 1
        l = iota  // 2
    )

}

運(yùn)算符

算術(shù)運(yùn)算符

運(yùn)算符術(shù)語(yǔ)
+加(既可以完成兩個(gè)數(shù)字相加,又可以連接兩個(gè)字符串)
-
*
/
%取模(取余)
++后自增(GO 語(yǔ)言中沒(méi)有前自增)
--后自減(GO 語(yǔ)言中沒(méi)有前自減)

賦值運(yùn)算符

運(yùn)算符說(shuō)明示例
=普通賦值c = a + b 將 a + b 表達(dá)式結(jié)果賦值給 c
+=相加后再賦值c += a 等價(jià)于 c = c + a
-=相減后再賦值c -= a 等價(jià)于 c = c - a
*=相乘后再賦值c *= a 等價(jià)于 c = c * a
/=相除后再賦值c /= a 等價(jià)于 c = c / a
%=求余后再賦值c %= a 等價(jià)于 c = c % a

關(guān)系運(yùn)算符

運(yùn)算符術(shù)語(yǔ)示例結(jié)果
==相等于4 == 3false
!=不等于4 != 3true
<小于4 < 3false
>大于4 > 3true
<=小于等于4 <= 3false
>=大于等于4 >= 1true

邏輯運(yùn)算符

運(yùn)算符術(shù)語(yǔ)示例結(jié)果
!!a如果 a 為假,則 !a 為真
如果 a 為真,則 !a 為假
&&a && b如果 a 和 b 都為真,則結(jié)果為真,否則為假
||a || b如果 a 和 b 有一個(gè)為真,則結(jié)果為真,二者都為假時(shí),結(jié)果為假

條件語(yǔ)句

if 語(yǔ)句

package main

import "fmt"

func main() {

    var score int
    fmt.Println("請(qǐng)輸入成績(jī):")
    fmt.Scanf("%d", &score)

    // if 語(yǔ)句支持一個(gè)初始化語(yǔ)句+判斷條件
    if good_score := 90; score >= good_score {
        fmt.Println("優(yōu)秀")
    } else if soso_score := 60; score >= soso_score {
        fmt.Println("及格")
    } else {
        fmt.Println("需要努力")
    }
}

switch 語(yǔ)句

注意:case 后面默認(rèn)自帶 break,如果想執(zhí)行完成某個(gè) case 后繼續(xù)執(zhí)行后面的 case,可以使用 fallthrough 關(guān)鍵字。

func main() {

    bonus := 5000
    var score string
    finish := true
    fmt.Println("請(qǐng)輸入年終評(píng)級(jí):")
    switch fmt.Scanf("%s", &score); score {
    case "A":
        bonus += 1000
    case "B":
        bonus += 5000
    case "C":
    case "D":
        bonus -= 1000
    default:
        finish = false
        fmt.Println("輸入有誤,請(qǐng)輸入正確的評(píng)級(jí)")
    }
    if finish {
        fmt.Printf("您的年終獎(jiǎng)為:%d", bonus)
    }

}

循環(huán)語(yǔ)句

GO 中的 3 種循環(huán)方式:

package main

import "fmt"

func main() {

    // 第1種方式
    for i := 0; i < 5; i++ {
        fmt.Printf("i=%d\n", i)
    }

    // 第2種方式:類(lèi)似while循環(huán)
    num := 1
    for num < 5 {
        fmt.Printf("num=%d\n", num)
        num++
    }

    // 第3種方式
    for {
        fmt.Println("死循環(huán)")
    }
}

函數(shù)

函數(shù)定義

函數(shù)就是將一堆代碼進(jìn)行封裝,以便重用的一種機(jī)制。

func 函數(shù)名(){
    函數(shù)體
}

參數(shù)列表

import "fmt"

func MyFunc(a int, b int, args ...int) {  // 注意:不定長(zhǎng)參數(shù)必須放在參數(shù)列表最后
    fmt.Println("定長(zhǎng)參數(shù)為:", a, b)
    for i, data := range args {  // 若不需要編號(hào),則可使用 for _, data := range args
        fmt.Println("編號(hào)為:", i)
        fmt.Println("數(shù)據(jù)為:", data)
    }
}

func main() {
    MyFunc(1, 2, 3, 4, 5)
}

打印結(jié)果:

定長(zhǎng)參數(shù)為: 1 2
編號(hào)為: 0
數(shù)據(jù)為: 3
編號(hào)為: 1
數(shù)據(jù)為: 4
編號(hào)為: 2
數(shù)據(jù)為: 5

函數(shù)返回值

// 定義返回值類(lèi)型
func Add(a int, b int) int {
    return a + b
}

// 給返回值命名
func Sub(a int, b int) (sub int) {
    sub = a - b
    return sub  // 也可以只寫(xiě) return
}

// 返回多個(gè)值
func Sub(a, b, c int) {
    a, b, c = 1, 2, 3
    return a, b, c  // 也可以只寫(xiě) return
}

函數(shù)類(lèi)型

在 GO 語(yǔ)言中還有另外一種定義使用函數(shù)的方式,就是函數(shù)類(lèi)型。

所謂的函數(shù)類(lèi)型,就是將函數(shù)作為一種類(lèi)型可以用來(lái)定義變量,基本使用如下:

func Test(a, b int) int {
    return a + b
}

// 定義函數(shù)類(lèi)型:即需要傳遞兩個(gè)整型參數(shù),有一個(gè)整型返回值的函數(shù)類(lèi)型
type FuncType func(a int, b int) int  // type關(guān)鍵字后面跟著類(lèi)型的名字(FunType)

func main() {
    var result FuncType  // 類(lèi)型是FuncType類(lèi)型,即函數(shù)類(lèi)型
    result = Test
    s := result(1, 2)
    fmt.Printf("s=%d", s)
}

匿名函數(shù)

所謂匿名函數(shù)就是沒(méi)有名字的函數(shù)。匿名函數(shù)最主要的功能就是實(shí)現(xiàn)了閉包。

package main

import "fmt"

func main() {
    num := 9

    // 使用方式一:定義匿名函數(shù)并賦值給變量
    f1 := func() {
        // 在匿名函數(shù)中可以直接訪問(wèn)main()中定義的局部變量
        // 并且在匿名函數(shù)中對(duì)變量的值進(jìn)行了修改,最終會(huì)影響到整個(gè)main()函數(shù)中定義的變量值
        num++
        fmt.Println("匿名函數(shù):", num)
    }
    f1()                        // 10
    fmt.Println("main函數(shù):", num) // 10

    // 使用方式二:通過(guò)函數(shù)類(lèi)型
    type FuncType func() // 沒(méi)有參數(shù),沒(méi)有返回值
    var f2 FuncType = f1
    f2()

    // 使用方式三:直接調(diào)用
    func(a, b int) {
        fmt.Println("a + b =", a+b)
    }(3, 6)

    // 有參有返回值的匿名函數(shù)
    min, max := func(a, b int) (min, max int) {
        if a > b {
            return b, a
        } else {
            return a, b
        }
    }(12, 13)
    fmt.Printf("min=%d, max=%d\n", min, max)
}

遞歸函數(shù)

示例:階乘

func Test(num int) int {
    if num == 1 {
        return 1
    }
    return num * Test(num-1)
}

func main() {
    var num int
    fmt.Println("請(qǐng)輸入需要階乘的數(shù):")
    fmt.Scanf("%d", &num)
    fmt.Printf("%d的階乘結(jié)果為:%d", num, Test(num))
}

 以上就是一文詳解Golang中的基礎(chǔ)語(yǔ)法的詳細(xì)內(nèi)容,更多關(guān)于Golang基礎(chǔ)語(yǔ)法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文帶你讀懂Golang?sync包之sync.Mutex

    一文帶你讀懂Golang?sync包之sync.Mutex

    sync.Mutex可以說(shuō)是sync包的核心了,?sync.RWMutex,?sync.WaitGroup...都依賴(lài)于他,?本章我們將帶你一文讀懂sync.Mutex,快跟隨小編一起學(xué)習(xí)一下吧
    2023-04-04
  • golang:json 反序列化的[]和nil操作

    golang:json 反序列化的[]和nil操作

    這篇文章主要介紹了golang:json 反序列化的[]和nil操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go源碼分析之預(yù)分配slice內(nèi)存

    Go源碼分析之預(yù)分配slice內(nèi)存

    這篇文章主要從Go語(yǔ)言源碼帶大家分析一下預(yù)分配slice內(nèi)存的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們深入了解go有一定的幫助,需要的可以學(xué)習(xí)一下
    2023-08-08
  • Golang設(shè)計(jì)模式之組合模式講解

    Golang設(shè)計(jì)模式之組合模式講解

    這篇文章主要介紹了Golang設(shè)計(jì)模式之組合模式,組合模式針對(duì)于特定場(chǎng)景,如文件管理、組織管理等,使用該模式能簡(jiǎn)化管理,使代碼變得非常簡(jiǎn)潔
    2023-01-01
  • 優(yōu)雅使用GoFrame共享變量Context示例詳解

    優(yōu)雅使用GoFrame共享變量Context示例詳解

    這篇文章主要為大家介紹了優(yōu)雅使用GoFrame共享變量Context示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang接口型函數(shù)使用小結(jié)

    Golang接口型函數(shù)使用小結(jié)

    接口函數(shù)指的是用函數(shù)實(shí)現(xiàn)接口,這樣在調(diào)用的時(shí)候就會(huì)非常簡(jiǎn)便,這種方式適用于只有一個(gè)函數(shù)的接口,這里以迭代一個(gè)map為例,演示這一實(shí)現(xiàn)的技巧,對(duì)Golang接口型函數(shù)使用知識(shí)感興趣的朋友一起看看吧
    2022-06-06
  • Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解

    Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)go build命令用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • go中string、int、float相互轉(zhuǎn)換方式

    go中string、int、float相互轉(zhuǎn)換方式

    這篇文章主要介紹了go中string、int、float相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 詳解Golang如何實(shí)現(xiàn)支持隨機(jī)刪除元素的堆

    詳解Golang如何實(shí)現(xiàn)支持隨機(jī)刪除元素的堆

    堆是一種非常常用的數(shù)據(jù)結(jié)構(gòu),它能夠支持在O(1)的時(shí)間復(fù)雜度獲取到最大值(或最小值)。本文主要介紹了如何實(shí)現(xiàn)支持O(log(n))隨機(jī)刪除元素的堆,需要的可以參考一下
    2022-09-09
  • Go引用github包的詳細(xì)流程步驟

    Go引用github包的詳細(xì)流程步驟

    這篇文章主要給大家介紹了關(guān)于Go引用github包的詳細(xì)流程步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Go具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

湘潭县| 务川| 饶阳县| 漯河市| 孝感市| 泸州市| 华蓥市| 建水县| 金阳县| 贵阳市| 濮阳市| 西乌| 丹寨县| 开封市| 织金县| 潢川县| 黄平县| 蓝山县| 宜宾县| 望城县| 新民市| 墨脱县| 招远市| 崇文区| 福贡县| 应城市| 文安县| 平江县| 抚顺县| 双峰县| 东乌珠穆沁旗| 五河县| 宜兰市| 安福县| 白朗县| 临安市| 双柏县| 故城县| 微山县| 曲周县| 德化县|