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

首頁 > 編程 > Golang > 正文

Golang極簡入門教程(一):基本概念

2020-04-01 19:26:02
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Golang極簡入門教程(一):基本概念,本文講解了Golang的基本知識(shí)、基礎(chǔ)語法、相關(guān)術(shù)語等,需要的朋友可以參考下
 

安裝 Golang

在 http://golang.org/dl/ 可以下載到 Golang。安裝文檔:http://golang.org/doc/install。

Hello Go

我們先創(chuàng)建一個(gè)文件 hello.go:

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

package main
 
import "fmt"
 
func main() {
    fmt.Printf("hello Golang/n");
}

 

執(zhí)行此程序:

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

go run hello.go

 

Golang 程序由包(packages)組成,程序從 main 包開始運(yùn)行:

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

package main

 

此語句表示此文件屬于 main 包(多個(gè)源文件可以屬于同一個(gè)包)。import 語句后接上包所在的路徑(被叫做包路徑或?qū)肼窂剑?,一個(gè)目錄中放置一個(gè)包,通常的做法是,目錄名和包名相同:

 

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

import (
    "fmt"
    "math/rand"
)

 

這里的 “fmt” 和 “math/rand” 為包路徑(導(dǎo)入路徑)。上面的 import 語句也可以這樣寫:

 

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

import "fmt"
import "math/rand"

 

我們導(dǎo)入了包之后,就可以通過 “包名.name” 來引用導(dǎo)出的 name 了,例如:

 

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

import "fmt"
 
// fmt 包導(dǎo)出了 Printf
fmt.Printf("hello Golang/n");

 

在 Golang 中,一個(gè)名字如果首字母大寫則表示此名字被導(dǎo)出。

函數(shù)

 

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

package main
 
import "fmt"
 
func add(x int, y int) int {
    return x + y
}
 
func main() {
    fmt.Println(add(42, 13))
}

需要注意的就是,變量名在類型之前,這和很多語言都不一樣。另外 x int, y int 也可以寫為 x, y int:
復(fù)制代碼代碼如下:

func add(x, y int) int {
    return x + y
}

函數(shù)可以返回多個(gè)值:

 

 

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

package main
 
import "fmt"
 
func swap(x, y string) (string, string) {
    return y, x
}
 
func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}

 

返回值可以被指定變量名,并且像變量一樣使用:

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

package main
 
import "fmt"
 
func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}
 
func main() {
    fmt.Println(split(17))
}

 

可以看到 split 函數(shù)直接使用 return 語句而不用帶參數(shù)。

變量

變量的聲明使用 var 語句:

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

var i int
var c, python, java bool

 

變量在聲明時(shí)可以進(jìn)行初始化:

 

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

var x, y int = 1, 2
var i, j = true, "hello"

 

我們看到,初始化時(shí)可以指定也可以不指定變量類型。
按照 Golang 的語法,在函數(shù)外的任何結(jié)構(gòu)(construct)都通過一個(gè)關(guān)鍵字開始,例如變量使用 var 關(guān)鍵字開始,函數(shù)使用 func 關(guān)鍵字開始。在函數(shù)內(nèi),變量賦值可以使用 := 操作符:

 

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

package main
 
func main() {
    var x, y int = 1, 2
    i, j := true, "hello"
}

 

:= 操作符左邊為變量,右邊為值。

數(shù)據(jù)類型

基本數(shù)據(jù)類型:

1.bool
2.string
3.int int8 int16 int32 int64
4.uint uint8 uint16 uint32 uint64
5.uintptr
6.byte(等價(jià)于 uint8)
7.rune(等價(jià)于 int32,用于表示一個(gè) unicode code point)
8.float32 float64
9.complex64 complex128

類型轉(zhuǎn)換使用表達(dá)式 T(v),含義為將 v 轉(zhuǎn)換為類型 T:

 

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

var i int = 42
var f float64 = float64(i)
 
i := 42
f := float64(i)

 

類型轉(zhuǎn)換總需要顯式的進(jìn)行。

使用 const 來聲明常量:

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

const Pi = 3.14
 
const (
    Big = 1 << 100
    Small = Big >> 99
)

 

控制語句

for 語句

Golang 使用(且只使用)for 來進(jìn)行循環(huán)(沒有 while 語句):

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

package main
 
func main() {
    sum := 0
    
    for i := 0; i < 10; i++ {
        sum += i
    }
    
    // 這種寫法等價(jià)于 C/C++ 等語言中的 while 語句
    for sum < 1000 {
        sum += sum
    }
}

 

區(qū)別于 C/C++ 等語言,使用 for 語句時(shí)不需要 () 并且 {} 是必須的(后面談到的 if、switch 在此語法處理上也是一樣的)。如果需要無限循環(huán),那么使用:

 

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

for {
}

 

if 語句

if 語句可以在執(zhí)行條件判斷前帶一個(gè)語句(這常被叫做 if 帶上一個(gè)短語句),此語句中變量的生命周期在 if 語句結(jié)束后結(jié)束。例如:

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

package main
 
import (
    "fmt"
    "math/rand"
)
 
func main() {
    if n := rand.Intn(6); n <= 2 {
        fmt.Println("[0, 2]", n)
    } else {
        fmt.Println("[3, 5]", n)
    }
 
    // 這里開始無法使用變量 n
}

 

switch

 

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

package main
 
import (
    "fmt"
    "runtime"
)
 
func main() {
    fmt.Print("Go runs on ")
    // switch 類似 if 可以帶上一個(gè)短語句
    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        // freebsd, openbsd,
        // plan9, windows...
        fmt.Printf("%s.", os)
    }
}

 

不像 C/C++ 等語言,Golang 中無需使用 break 語句來跳出 switch。另外,switch 可以沒有條件:

 

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

package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("Good morning!")
    case t.Hour() < 17:
        fmt.Println("Good afternoon.")
    default:
        fmt.Println("Good evening.")
    }
}

 

defer

一個(gè) defer 語句能夠?qū)⒁粋€(gè)函數(shù)調(diào)用加入一個(gè)列表中(這個(gè)函數(shù)調(diào)用被叫做 deferred 函數(shù)調(diào)用),在當(dāng)前函數(shù)調(diào)用結(jié)束時(shí)調(diào)用列表中的函數(shù)。范例:

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

func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    defer src.Close()
 
    dst, err := os.Create(dstName)
    if err != nil {
        return
    }
    defer dst.Close()
 
    return io.Copy(dst, src)
}

 

deferred 函數(shù)調(diào)用按先進(jìn)后出的順序執(zhí)行:

 

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

package main
 
import "fmt"
 
func main() {
    for i := 0; i < 5; i++ {
        // 輸出 43210
        defer fmt.Print(i)
    }
}

 

結(jié)構(gòu)(structs)

結(jié)構(gòu)是一個(gè)域的集合:

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

package main
 
import "fmt"
 
type Vertex struct {
    X int
    Y int
}
 
func main() {
    v := Vertex{1, 2}
    v.X = 4
    fmt.Println(v)
}

 

Golang 中是存在指針的,但是指針不支持算術(shù)運(yùn)算:

 

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

p := Vertex{1, 2} // {1, 2} 為 struct literal
q := &p // q 類型為 *Vertex
q.X = 2 // 直接訪問域 X

 

就像上面看到的,struct 的 literal 由 {} 包裹,在 struct literal 中我們可以使用 Name: 這樣的語法來為特定域設(shè)置值:

 

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

type Vertex struct {
    X, Y int
}
 
r := Vertex{X: 3} // 這時(shí)候 Y 為 0

 

new 函數(shù)

我們可以通過表達(dá)式 new(T) 分配一個(gè)被初始化為 0 且類型為 T 的值,并且返回指向此值的指針,用法如下:

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

var p *T = new(T)
p := new(T)

 

更詳盡的例子:

 

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

package main
 
import "fmt"
 
type Vertex struct {
    X, Y int
}
 
func main() {
    v := new(Vertex)
    fmt.Println(v)
    v.X, v.Y = 11, 9
    fmt.Println(v)
}

 

數(shù)組和 slice

[n]T 在 Golang 中是一個(gè)類型(就像 *T 一樣),表示一個(gè)長度為 n 的數(shù)組其元素類型為 T。范例:

 

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

package main
 
import "fmt"
 
func main() {
    var a [2]string
    a[0] = "Hello"
    a[1] = "World"
    fmt.Println(a[0], a[1])
    fmt.Println(a)
}

 

注意,數(shù)組長度無法被改變。

slice 是一個(gè)數(shù)據(jù)結(jié)構(gòu),其指向一個(gè)數(shù)組某個(gè)連續(xù)的部分。slice 用起來很像數(shù)組。[]T 為 slice 類型,其中元素類型為 T:

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

package main
 
import "fmt"
 
func main() {
    // 構(gòu)建一個(gè) slice
    p := []int{2, 3, 5, 7, 11, 13}
    fmt.Println("p ==", p)
 
    for i := 0; i < len(p); i++ {
        fmt.Printf("p[%d] == %d/n", i, p[i])
    }
}

 

表達(dá)式 s[lo:hi] 用于創(chuàng)建一個(gè) slice,新創(chuàng)建的 slice 的元素為 s 中 [lo, hi) 位置的元素。

創(chuàng)建 slice 使用 make 函數(shù)(而不是用 new 函數(shù),因?yàn)樾枰O(shè)置額外的參數(shù)來控制 slice 的創(chuàng)建):

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

// len(a) 為 5
a := make([]int, 5)

 

這里 make 函數(shù)會(huì)創(chuàng)建一個(gè)數(shù)組(其元素初始化為 0)并返回一個(gè) slice 指向此數(shù)組。make 可以帶第三個(gè)參數(shù),用于指定容量:

 

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

// len(b) 為 0
// cap(b) 為 5
b := make([]int, 0, 5)
 
b = b[:cap(b)] // len(b)=5, cap(b)=5
b = b[1:] // len(b)=4, cap(b)=4

 

一個(gè)沒有值的 slice 是 nil,長度和容量都為 0。

 

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

package main
 
import "fmt"
 
func main() {
    var z []int
    fmt.Println(z, len(z), cap(z))
    if z == nil {
        fmt.Println("nil!")
    }
}

 

range

range 被用在 for 中來迭代一個(gè) slice 或者一個(gè) map:

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

package main
 
import "fmt"
 
var s = []int{1, 2, 3}
 
func main() {
    for i, v := range s {
        fmt.Println(i, v)
    }
 
    // 只需要值,使用 _ 忽略索引
    for _, v := range s {
        fmt.Println(v)
    }
 
    // 只需要索引
    for i := range s {
        fmt.Println(i)
    }
}

 

map

map 用于映射 key 到 value(值)。map 可以通過 make 來創(chuàng)建(而非 new):

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

package main
 
import "fmt"
 
type Vertex struct {
    Lat, Long float64
}
 
var m map[string]Vertex
 
func main() {
    m = make(map[string]Vertex)
    m["Bell Labs"] = Vertex{
        40.68433, -74.39967,
    }
    fmt.Println(m["Bell Labs"])
}

 

map iteral 很像 struct literal:

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

var m = map[string]Vertex{
    // 這里 Vertex 可以省略不寫
    "Bell Labs": Vertex{
        40.68433, -74.39967,
    },
    "Google": Vertex{
        37.42202, -122.08408,
    },
}

 

使用 [] 來訪問 map 中的值,使用 delete 來刪除 map 中的值:

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

m[key] = elem
elem = m[key]
delete(m, key)

如果需要檢查 map 中某 key 是否存在使用:
復(fù)制代碼代碼如下:

elem, ok = m[key]

elem 表示 key 的值(key 不存在時(shí),elem 為 0),ok 表示 key 是否存在。

 

閉包

Golang 中函數(shù)也是一個(gè)值(就像 int 值一樣),且函數(shù)可以是一個(gè)閉包。閉包是一個(gè)引用了外部變量的函數(shù)。看一個(gè)例子:

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

package main
 
import "fmt"
 
func adder() func(int) int {
    sum := 0
    // 返回一個(gè)閉包,此閉包引用了外部變量 sum
    return func(x int) int {
        sum += x
        return sum
    }
}
 
func main() {
    a := adder()
    fmt.Println(a(9527))
}

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
波多野结衣国产| 亚洲成人精品视频在线观看| 亚洲国产成人精品无码区99| 自拍小视频在线观看| 一本色道久久综合亚洲91| 涩涩网站在线看| 国产精品大陆在线观看| 国产精品无码久久久久一区二区| 国产69精品久久久久9999小说| 国外男同性恋在线看| av资源在线免费观看| 欧美另类videosbest视频| 日本欧美在线看| 国产亚洲一区二区三区在线播放| 日本高清不卡一区二区三区视频| 韩曰欧美视频免费观看| 先锋影音av男人站| 亚洲高清123| 这里精品视频免费| 欧美一级黄色片视频| 日韩成人在线电影网| 中文字幕第24页| 精品国产一区二区三区久久影院| 国产亚洲欧洲997久久综合| 一本色道久久综合无码人妻| 国产精品日韩在线一区| 99久久综合99久久综合网站| 久久久噜噜噜久噜久久| 香港日本韩国三级| 日韩国产一区二区| 麻豆传媒在线播放| 超碰96在线| 日韩一级片免费观看| 麻豆精品新av中文字幕| 久久久久久69| 国产精品99久久久久久董美香| 亚洲国产成人精品视频| 欧美激情无毛| juy有坂深雪中文字幕| 欧一区二区三区| 亚洲精品福利视频网站| 国产情侣一区二区三区| 国产一区激情在线| 韩国女主播一区二区三区| 国产色a在线| 日本伊人精品一区二区三区观看方式| 伊人久久大香线蕉综合四虎小说| 国产精品自拍毛片| 久久中文字幕电影| 久久99欧美| 亚洲欧洲午夜一线一品| 日韩中文字幕视频在线| 欧美国产日本在线| 成人精品高清在线| 日韩高清第一页| 一本色道久久88| 捆绑变态av一区二区三区| 久久精品国产69国产精品亚洲| 2019亚洲日韩新视频| 亚洲大片一区二区三区| 日本一区二区三区中文字幕| 欧美精选午夜久久久乱码6080| 欧美美女黄色网| 19j韩国主播韩宝贝在线| av黄色在线播放| 一区二区在线免费| 91超碰rencao97精品| 国产99久久久久久免费看农村| 亚洲欧美日韩精品在线| 日本vs亚洲vs韩国一区三区二区| 五月激情五月婷婷| 日本免费专区| 欧美色图亚洲图片| 成人午夜看片网址| 亚洲最大的免费| 国产精品的网站| 久久久精品免费网站| 国产精品白浆一区二小说| 国产成人免费av电影| 日日日日人人人夜夜夜2017| 日韩经典中文字幕在线观看| 美女高潮网站| www污网站在线观看| 精品午夜福利视频| 国产精品6699| 成年网站在线免费观看| 免费播放片a高清在线观看| 视频一区国产精品| 亚洲经典一区二区三区| 在线播放av中文字幕| 亚洲一区电影在线观看| 日韩风俗一区 二区| 久久精品一区蜜桃臀影院| 亚洲区一区二区三区| av超碰在线观看| 99精品视频免费观看| 日韩欧美国产一区二区| 蜜桃精品一区二区| 污视频在线看操| 2023av在线| 欧美艾v福利视频在线观看| 国产成年妇视频| 亚洲美女av黄| 午夜精品视频一区二区三区在线看| 美国毛片一区二区三区| 97精品国产露脸对白| 色婷婷在线视频观看| 成人嫩草影院免费观看| 美日韩精品免费观看视频| 国产大陆a不卡| 亚洲一区二区三区成人在线视频精品| 资源网第一页久久久| 制服丝袜成人动漫| 精品久久久精品| 51av在线| 日本三级亚洲精品| 国产蜜臀一区二区打屁股调教| 国产原创一区二区三区| 欧美大片在线看| 国内精品久久久久久久久电影网| 日本道在线观看一区二区| 欧美极品aⅴ影院| 日本美女一级片| 国产成人在线一区| aa级大片欧美三级| 国产一区二区三区四区五区| 日本h片在线看| 99久热在线精品视频观看| 欧美金发大战黑人最粗videos| 影音先锋导航| 精品一区二区三区日韩| 亚洲午夜91| 乱色精品无码一区二区国产盗| 亚洲免费国产视频| 日韩在线观看免费高清| 国产免费久久久久| 亚洲午夜精品久久久久久浪潮| 日本黄色一区二区三区| 色综合久久久久无码专区| 日本福利视频在线| 性欧美xxxx大乳国产app| 亚洲人成网在线播放| 91制片厂毛片| 91精品国产91久久久久久一区二区| 中出中文字幕| 天天射天天操天天干| 欧美视频在线观看免费网址| 成人动漫在线观看视频| 欧美xxxx做受欧美.88| 成人精品一区二区三区| 欧美日韩激情在线观看| 91精品日本| 美女精品一区最新中文字幕一区二区三区| 欧美精品亚洲二区| 天天操夜夜爽| 成人自拍av| 成人影院午夜久久影院| 欧美xingq一区二区| 亚洲女与黑人做爰| 性久久久久久久久久久久久久| 91热精品视频| 久久亚洲春色中文字幕| 精品国产一区二区在线| 亚洲大片精品免费| 国产z一区二区三区| 人妻无码一区二区三区| av一级黄色片| 欧美一区二区三区精品| 日韩在线观看视频一区二区三区| 一个人在线视频免费观看www| 久久影院中文字幕| 亚洲国产精品久久久久婷婷老年| 欧美久久一区二区三区| 筱崎爱全乳无删减在线观看| 国产精品果冻传媒| 精品中文视频| 国产大片中文字幕| 老妇喷水一区二区三区| 亚洲人成免费网站| 亚洲成a人v欧美综合天堂| 婷婷综合网站| 亚洲成人免费视| 亚洲国产岛国毛片在线| 欧美自拍偷拍第一页| 国产精品一区二区三区av麻| 日韩不卡中文字幕| 综合av色偷偷网| 国内精品久久久久久久影视简单| 91精品国产91久久久久福利| 中日韩在线观看视频| 91香蕉一区二区三区在线观看| 91青娱乐在线视频| 亚洲国产精品久久久久| 国语对白做受xxxxx在线中国| 在线免费高清一区二区三区| 特级丰满少妇一级aaaa爱毛片| 国产在线综合视频| 亚洲青色在线| 成人教育av在线| 亚洲激情欧美色图| 裸体在线国模精品偷拍| 国产日韩三级在线| 自拍亚洲欧美老师丝袜| 97超碰在线公开在线看免费| 被男同事摸的水好多| 正在播放日韩精品| 无码精品a∨在线观看中文| 欧美性猛交p30| 无遮挡爽大片在线观看视频| 欧美三级午夜理伦三级小说| 丁香啪啪综合成人亚洲小说| 日韩欧美a级成人黄色| 国产日韩一区二区在线观看| 91高清在线观看视频| www.亚洲天堂| 日韩一级片免费观看| 国产精品18久久久久久麻辣| 影视一区二区| 久久久久一区二区三区| 中文字幕在线看视频国产欧美在线看完整| 亚洲欧美aⅴ...| videos性欧美另类高清| 136国产福利精品导航网址| 123区在线| 黄色一级视频免费| 欧洲中文字幕精品| www.久久久久久久久久| 日韩综合第一页| 久久av在线| 香蕉免费毛片视频| 亚洲 自拍 另类小说综合图区| 另类小说视频一区二区| 国产伦精品一区二区三区四区视频_| 国产综合亚洲精品一区二| 福利视频一区二区三区| 日韩精品在线观看一区二区| 伦理一区二区| 91国自产精品中文字幕亚洲| 二区三区不卡不卡视频| 久久一区亚洲| 欧美野外性xxxxfeexxxx| 网站在线观看你懂的| 中文字幕免费观看视频| 9自拍视频在线观看| 日批免费在线观看| 亚洲性av网站| 欧美成人免费视频a| 久草国产在线视频| 一区三区二区视频| 久久夜夜操妹子| 婷婷在线观看视频| 久久色在线播放| 天天操天天干天天操天天干| 日本xxxxxx| 可以看毛片的网址| 欧美色图在线播放| 欧美性生活大片视频| 91美女主播在线视频| 中文字幕av片| 99亚洲伊人久久精品影院| 欧美熟乱15p| 国产精品人人妻人人爽人人牛| 四虎国产精品永久地址998| 亚洲国产精品视频在线| 成人免费在线观看网站| 精品欧美久久久| 亚洲1区2区3区视频| 九七影院97影院理论片久久| 四虎地址8848精品| 欧美亚洲精品一区二区| 欧美精品videos性欧美| 人人干狠狠干| 日本少妇xxxxx| av在线一区二区三区| 亚洲宅男网av| jizz大全欧美jizzcom| 国产又粗又猛又爽又黄| 天天摸天天做天天爽| 国产尤物一区二区| 国内视频一区二区| 在线不卡日本v二区707| 91成人福利社区| 欧美极品少妇xxxxⅹ免费视频| 色av手机在线| 日韩精品电影网站| 一区二区三区麻豆| 91精品国产91久久久久久三级| 亚洲精品成人免费| 国产一区福利视频| 一级黄色特级片| 国产精品一区一区三区| 国产亚洲午夜高清国产拍精品| 国内精品久久久久久久久久| 日本免费网址| 欧美日韩午夜在线视频| 99re视频这里只有精品| 欧美一级片网址| 国产精品中文久久久久久| 国产精华7777777| 伪装者在线观看完整版免费| 日韩欧美亚洲综合| 成人影院久久久久久影院| 91嫩草丨国产丨精品| 久久久久国产精品午夜一区| 国产精品区一区二区三区| 欧美成年人视频网站欧美| 丁香六月综合| 国产精品探花在线| 盗摄女厕thunder| 337p粉嫩大胆色噜噜噜噜亚洲| 岛国大片在线播放| 老鸭窝一区二区| av电影院在线看| 精品国产乱码久久久久久1区二区| 色婷婷一区二区三区av免费看| 亚洲精品免费av| 996这里只有精品| 青娱乐国产盛宴| 人人妻人人澡人人爽人人欧美一区| 91高清在线免费观看| 黄在线观看网站| 国产视频手机在线| 九九免费精品视频| 色偷偷7777www人| 亚洲天堂自拍偷拍| 精品国产乱码久久久久酒店| 在线观看色视频| 一区二区三区小说|