亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 70819 | 回復(fù): 4
打印 上一主題 下一主題

[其他] Golang極簡(jiǎn)入門教程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-05-25 13:08 |只看該作者 |倒序?yàn)g覽
安裝 Golang

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

Hello Go

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

  1. package main

  2. import "fmt"

  3. func main() {
  4.     fmt.Printf("hello Golang\n");
  5. }
復(fù)制代碼

執(zhí)行此程序:


  1. go run hello.go
復(fù)制代碼



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


  1. package main
復(fù)制代碼

此語(yǔ)句表示此文件屬于 main 包(多個(gè)源文件可以屬于同一個(gè)包)。import 語(yǔ)句后接上包所在的路徑(被叫做包路徑或?qū)肼窂剑,一個(gè)目錄中放置一個(gè)包,通常的做法是,目錄名和包名相同:
  1. import (
  2.     "fmt"
  3.     "math/rand"
  4. )
復(fù)制代碼

這里的 “fmt” 和 “math/rand” 為包路徑(導(dǎo)入路徑)。上面的 import 語(yǔ)句也可以這樣寫:
  1. import "fmt"
  2. import "math/rand"
復(fù)制代碼

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

// fmt 包導(dǎo)出了 Printf
fmt.Printf("hello Golang\n");
在 Golang 中,一個(gè)名字如果首字母大寫則表示此名字被導(dǎo)出。

函數(shù)

  1. package main

  2. import "fmt"

  3. func add(x int, y int) int {
  4.     return x + y
  5. }

  6. func main() {
  7.     fmt.Println(add(42, 13))
  8. }
復(fù)制代碼


需要注意的就是,變量名在類型之前,這和很多語(yǔ)言都不一樣。另外 x int, y int 也可以寫為 x, y int:
  1. func add(x, y int) int {
  2.     return x + y
  3. }
復(fù)制代碼

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

  2. import "fmt"

  3. func swap(x, y string) (string, string) {
  4.     return y, x
  5. }

  6. func main() {
  7.     a, b := swap("hello", "world")
  8.     fmt.Println(a, b)
  9. }
復(fù)制代碼

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

  1. package main

  2. import "fmt"

  3. func split(sum int) (x, y int) {
  4.     x = sum * 4 / 9
  5.     y = sum - x
  6.     return
  7. }

  8. func main() {
  9.     fmt.Println(split(17))
  10. }
復(fù)制代碼

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

變量

變量的聲明使用 var 語(yǔ)句:


  1. var i int
  2. var c, python, java bool
復(fù)制代碼

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

  1. var x, y int = 1, 2
  2. var i, j = true, "hello"
復(fù)制代碼

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

  1. package main

  2. func main() {
  3.     var x, y int = 1, 2
  4.     i, j := true, "hello"
  5. }
復(fù)制代碼

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

數(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:

  1. var i int = 42
  2. var f float64 = float64(i)

  3. i := 42
  4. f := float64(i)
復(fù)制代碼

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

使用 const 來(lái)聲明常量:


  1. const Pi = 3.14

  2. const (
  3.     Big = 1 << 100
  4.     Small = Big >> 99
  5. )
復(fù)制代碼

控制語(yǔ)句

for 語(yǔ)句

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


  1. package main

  2. func main() {
  3.     sum := 0
  4.    
  5.     for i := 0; i < 10; i++ {
  6.         sum += i
  7.     }
  8.    
  9.     // 這種寫法等價(jià)于 C/C++ 等語(yǔ)言中的 while 語(yǔ)句
  10.     for sum < 1000 {
  11.         sum += sum
  12.     }
  13. }
復(fù)制代碼

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

  1. for {
  2. }
復(fù)制代碼

if 語(yǔ)句

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


  1. package main

  2. import (
  3.     "fmt"
  4.     "math/rand"
  5. )

  6. func main() {
  7.     if n := rand.Intn(6); n <= 2 {
  8.         fmt.Println("[0, 2]", n)
  9.     } else {
  10.         fmt.Println("[3, 5]", n)
  11.     }

  12.     // 這里開(kāi)始無(wú)法使用變量 n
  13. }
復(fù)制代碼

switch
  1. package main

  2. import (
  3.     "fmt"
  4.     "runtime"
  5. )

  6. func main() {
  7.     fmt.Print("Go runs on ")
  8.     // switch 類似 if 可以帶上一個(gè)短語(yǔ)句
  9.     switch os := runtime.GOOS; os {
  10.     case "darwin":
  11.         fmt.Println("OS X.")
  12.     case "linux":
  13.         fmt.Println("Linux.")
  14.     default:
  15.         // freebsd, openbsd,
  16.         // plan9, windows...
  17.         fmt.Printf("%s.", os)
  18.     }
  19. }
復(fù)制代碼

不像 C/C++ 等語(yǔ)言,Golang 中無(wú)需使用 break 語(yǔ)句來(lái)跳出 switch。另外,switch 可以沒(méi)有條件:
  1. package main

  2. import (
  3.     "fmt"
  4.     "time"
  5. )

  6. func main() {
  7.     t := time.Now()
  8.     switch {
  9.     case t.Hour() < 12:
  10.         fmt.Println("Good morning!")
  11.     case t.Hour() < 17:
  12.         fmt.Println("Good afternoon.")
  13.     default:
  14.         fmt.Println("Good evening.")
  15.     }
  16. }
復(fù)制代碼

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

  1. func CopyFile(dstName, srcName string) (written int64, err error) {
  2.     src, err := os.Open(srcName)
  3.     if err != nil {
  4.         return
  5.     }
  6.     defer src.Close()

  7.     dst, err := os.Create(dstName)
  8.     if err != nil {
  9.         return
  10.     }
  11.     defer dst.Close()

  12.     return io.Copy(dst, src)
  13. }
復(fù)制代碼

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

  2. import "fmt"

  3. func main() {
  4.     for i := 0; i < 5; i++ {
  5.         // 輸出 43210
  6.         defer fmt.Print(i)
  7.     }
  8. }
復(fù)制代碼
結(jié)構(gòu)(structs)
結(jié)構(gòu)是一個(gè)域的集合:

  1. package main

  2. import "fmt"

  3. type Vertex struct {
  4.     X int
  5.     Y int
  6. }

  7. func main() {
  8.     v := Vertex{1, 2}
  9.     v.X = 4
  10.     fmt.Println(v)
  11. }
復(fù)制代碼
Golang 中是存在指針的,但是指針不支持算術(shù)運(yùn)算:
  1. p := Vertex{1, 2} // {1, 2} 為 struct literal
  2. q := &p // q 類型為 *Vertex
  3. q.X = 2 // 直接訪問(wèn)域 X
復(fù)制代碼
就像上面看到的,struct 的 literal 由 {} 包裹,在 struct literal 中我們可以使用 Name: 這樣的語(yǔ)法來(lái)為特定域設(shè)置值:
  1. type Vertex struct {
  2.     X, Y int
  3. }

  4. r := Vertex{X: 3} // 這時(shí)候 Y 為 0
復(fù)制代碼
new 函數(shù)
我們可以通過(guò)表達(dá)式 new(T) 分配一個(gè)被初始化為 0 且類型為 T 的值,并且返回指向此值的指針,用法如下:

  1. var p *T = new(T)
  2. p := new(T)
復(fù)制代碼
更詳盡的例子:
  1. package main

  2. import "fmt"

  3. type Vertex struct {
  4.     X, Y int
  5. }

  6. func main() {
  7.     v := new(Vertex)
  8.     fmt.Println(v)
  9.     v.X, v.Y = 11, 9
  10.     fmt.Println(v)
  11. }
復(fù)制代碼
數(shù)組和 slice
[n]T 在 Golang 中是一個(gè)類型(就像 *T 一樣),表示一個(gè)長(zhǎng)度為 n 的數(shù)組其元素類型為 T。范例:
  1. package main

  2. import "fmt"

  3. func main() {
  4.     var a [2]string
  5.     a[0] = "Hello"
  6.     a[1] = "World"
  7.     fmt.Println(a[0], a[1])
  8.     fmt.Println(a)
  9. }
復(fù)制代碼
注意,數(shù)組長(zhǎng)度無(wú)法被改變。
slice 是一個(gè)數(shù)據(jù)結(jié)構(gòu),其指向一個(gè)數(shù)組某個(gè)連續(xù)的部分。slice 用起來(lái)很像數(shù)組。[]T 為 slice 類型,其中元素類型為 T:
  1. package main

  2. import "fmt"

  3. func main() {
  4.     // 構(gòu)建一個(gè) slice
  5.     p := []int{2, 3, 5, 7, 11, 13}
  6.     fmt.Println("p ==", p)

  7.     for i := 0; i < len(p); i++ {
  8.         fmt.Printf("p[%d] == %d\n", i, p[i])
  9.     }
  10. }
復(fù)制代碼

表達(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ù)來(lái)控制 slice 的創(chuàng)建):

  1. // len(a) 為 5
  2. a := make([]int, 5)
復(fù)制代碼
這里 make 函數(shù)會(huì)創(chuàng)建一個(gè)數(shù)組(其元素初始化為 0)并返回一個(gè) slice 指向此數(shù)組。make 可以帶第三個(gè)參數(shù),用于指定容量:
  1. // len(b) 為 0
  2. // cap(b) 為 5
  3. b := make([]int, 0, 5)

  4. b = b[:cap(b)] // len(b)=5, cap(b)=5
  5. b = b[1:] // len(b)=4, cap(b)=4
復(fù)制代碼
一個(gè)沒(méi)有值的 slice 是 nil,長(zhǎng)度和容量都為 0。
  1. package main

  2. import "fmt"

  3. func main() {
  4.     var z []int
  5.     fmt.Println(z, len(z), cap(z))
  6.     if z == nil {
  7.         fmt.Println("nil!")
  8.     }
  9. }
復(fù)制代碼
range
range 被用在 for 中來(lái)迭代一個(gè) slice 或者一個(gè) map:

  1. package main

  2. import "fmt"

  3. var s = []int{1, 2, 3}

  4. func main() {
  5.     for i, v := range s {
  6.         fmt.Println(i, v)
  7.     }

  8.     // 只需要值,使用 _ 忽略索引
  9.     for _, v := range s {
  10.         fmt.Println(v)
  11.     }

  12.     // 只需要索引
  13.     for i := range s {
  14.         fmt.Println(i)
  15.     }
  16. }
復(fù)制代碼
map
map 用于映射 key 到 value(值)。map 可以通過(guò) make 來(lái)創(chuàng)建(而非 new):

  1. package main

  2. import "fmt"

  3. type Vertex struct {
  4.     Lat, Long float64
  5. }

  6. var m map[string]Vertex

  7. func main() {
  8.     m = make(map[string]Vertex)
  9.     m["Bell Labs"] = Vertex{
  10.         40.68433, -74.39967,
  11.     }
  12.     fmt.Println(m["Bell Labs"])
  13. }
復(fù)制代碼
map iteral 很像 struct literal:

  1. var m = map[string]Vertex{
  2.     // 這里 Vertex 可以省略不寫
  3.     "Bell Labs": Vertex{
  4.         40.68433, -74.39967,
  5.     },
  6.     "Google": Vertex{
  7.         37.42202, -122.08408,
  8.     },
  9. }
復(fù)制代碼
使用 [] 來(lái)訪問(wèn) map 中的值,使用 delete 來(lái)刪除 map 中的值:

  1. m[key] = elem
  2. elem = m[key]
  3. delete(m, key)
復(fù)制代碼
如果需要檢查 map 中某 key 是否存在使用:
  1. elem, ok = m[key]
復(fù)制代碼
elem 表示 key 的值(key 不存在時(shí),elem 為 0),ok 表示 key 是否存在。
閉包
Golang 中函數(shù)也是一個(gè)值(就像 int 值一樣),且函數(shù)可以是一個(gè)閉包。閉包是一個(gè)引用了外部變量的函數(shù)?匆粋(gè)例子:

  1. package main

  2. import "fmt"

  3. func adder() func(int) int {
  4.     sum := 0
  5.     // 返回一個(gè)閉包,此閉包引用了外部變量 sum
  6.     return func(x int) int {
  7.         sum += x
  8.         return sum
  9.     }
  10. }

  11. func main() {
  12.     a := adder()
  13.     fmt.Println(a(9527))
  14. }
復(fù)制代碼

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2015-09-13 17:30 |只看該作者
謝謝樓主分享。來(lái)支持你了

論壇徽章:
6
CU大;照
日期:2013-04-17 10:59:39CU大;照
日期:2013-04-17 11:01:45CU大;照
日期:2013-04-17 11:02:15CU大;照
日期:2013-04-17 11:02:36CU大;照
日期:2013-04-17 11:02:582015年辭舊歲徽章
日期:2015-03-03 16:54:15
3 [報(bào)告]
發(fā)表于 2016-10-10 16:32 |只看該作者
看完這些可以寫簡(jiǎn)單的小程序了。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2018-09-23 23:47 |只看該作者
不會(huì)這么一點(diǎn)吧
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP