1. 程式人生 > >第01天-基礎-基本概念、環境搭建、第一個Go程序

第01天-基礎-基本概念、環境搭建、第一個Go程序

分配 功能 cat golang 只需要 ima package info cond

一、環境搭建

見我的這篇博客 https://www.cnblogs.com/xuejiale/p/10258244.html

二、golang語言特性
1. 垃圾回收
1) 內存自動回收,再也不需要開發人員管理內存
2) 開發人員專註業務實現,降低了心智負擔
3) 只需要new分配內存,不需要釋放
2. 天然並發
1) 從語言層面支持並發,非常簡單
2) goroute,輕量級線程,創建成千上萬個goroute成為可能
例如:

我們創建F:\go\project\src\go_dev\day1\goroute目錄,並在該目錄下創建文件goroute.go及main.go
goroute.go:

package main

import(
    "fmt"
)

func test_goroute(a int) {
    fmt.Println(a)
}

main.go:

package main

import(
    "time"
)

func main() {
    //goroute 並發,使用go關鍵字
    for i := 0; i < 100; i++ {
        go test_goroute(i)
    }
    //這塊sleep 2s是為了等待上面"線程"執行完
    time.Sleep(2*time.Second) //sleep 2s
}

解釋:

  goroute,輕量級線程通過關鍵字go來執行(go test_goroute(i))

運行:

到F:\go\project\src\go_dev\day1\goroute目錄下運行go run main.go goroute.go 可以發現100個數據打出是亂序

技術分享圖片

註意:運行的命令 go run main.go goroute.go (go run main.go會報錯

3) 基於CSP(Communicating Sequential Process)模型實現 (goroute + channel算是CSP模型)
3. channel
1) 管道,類似unix/linux中的pipe

func main() {
    pipe := make(chan int,3)
    pipe <- 1
    pipe <- 2
}

2) 多個goroute之間通過channel進行通信

在F:\Go\project\src\go_dev\day1\goroute_example目錄下創建goroute和main目錄
goroute目錄下創建add.go:
add.go

package goroute

func Add(a int, b int, c chan int) {
    sum := a + b
    c <- sum
}

在main目錄下創建main.go:

main.go

package main

import (
    "go_dev/day1/goroute_example/goroute"
    "fmt"
)

func main() {
    var pipe chan int
    pipe = make(chan int, 1)
    go goroute.Add(100, 200, pipe)
    sum := <- pipe
    fmt.Println("sum = ", sum)
}

解釋:

var pipe chan int
pipe = make(chan int, 1) 分別為定義一個管道,裏面可以存一個整數

運行:

方法1. 進入到F:\Go\project目錄下,執行下面的命令

go run src/go_dev/day1/goroute_example/main/main.go

技術分享圖片

方法2. 先編譯成二進制文件,然後執行(需創建F:\go\project\bin目錄,存放編譯後的二進制文件)

go build -o bin/goroute_test.exe go_dev/day1/goroute_example/main 註意該命令與方法1 命令的區別

技術分享圖片

註意:Windows下可執行文件需以.exe結尾。

3) 支持任何類型

4. 多返回值
一個函數返回多個值

func calc(a int, b int)(int,int) {
    sum := a + b
    avg := (a+b)/2
    return sum, avg
}

調用:

sum, avg := calc(10, 20)
//如果只需要第一個返回值:
sum, _ := calc(10, 20)

5. 包的概念

1) 和python一樣,把相同功能的代碼放到一個目錄,稱之為包;
2) 包可以被其他包引用;
3) main包是用來生成可執行文件,每個程序只有一個main包;
4) 包的主要用途是提高代碼的可復用性。

例如:

創建F:\Go\project\src\go_dev\day1\package_example目錄,在該目錄下分別創建calc和main目錄,在calc目錄下創建add.go和sub.go,在main目錄下創建main.go
add.go (註意add.go和sub.go中的方法名首字母必須大寫,否則無法被外部調用)

package calc

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

sub.go

package calc 

func Sub(a int, b int) int {
    return a - b
}

main.go

package main 

import (
    "fmt"
    "go_dev/day1/package_example/calc"
)

func main() {
    sum := calc.Add(100, 200)    
    sub := calc.Sub(100, 200)
    fmt.Println("add = ", sum)
    fmt.Println("sub = ", sub)
}

運行:

方法1. 執行go run src/go_dev/day1/package_example/main/main.go

技術分享圖片

方法2. 生成可執行文件

技術分享圖片

第01天-基礎-基本概念、環境搭建、第一個Go程序