**測試
func foo(list int)
return
}func main()
foo(list)
fmt.printf("%v", list)
}// 結果
[10, 11, 12]
在64位
架構的機器上,乙個切片需要24位元組
的記憶體,指標字段需要8位元組
,長度和容量各需要8位元組
。
指向t型別的值的
方法集只包含值接收者
宣告的方法。
指向t型別的指標
的方法集包含值接收者
宣告和指標接收者
宣告的方法。
go
語言執行時缺省會為每個可用的物理處理器分配乙個邏輯處理器
。
如果建立乙個goroutine
並準備執行,這個goroutine
就會被到排程器的全域性執行佇列中。之後,排程器就將這些佇列中的goroutine
分配給乙個邏輯處理器,並放到這個邏輯處理器對應的本地執行佇列中。
邏輯處理器
本地執行佇列
排程器
使用go build -race
競爭檢測器標誌來編譯程式
執行程式./go_start.exe
出現警告。
可以使用atomic
和sync
包下的方法或函式保證執行緒安全
unbuffered := make(chan int)
buffered := make(chan string, 10)
第乙個是無緩衝的通道,第二是有緩衝的通道
任務執行,需要考慮的情況:
系統中斷
完成情況(完成 or 失敗)
超時runner自帶超時與中斷功能
type runner struct
var errtimeout = errors.new("received timeout")
var errinterrupt = errors.new("received interrupt")
// new a runner
func new(d time.duration) *runner
}func (r *runner) add(tasks ...func(int))
func (r *runner) start() error ()
select
}func (r *runner) run() error
task(id)
} return nil
}func (r *runner) gotinterrupt() bool
}
資源管理池
package pool
import (
"errors"
"io"
"log"
"sync"
)type pool struct
var errpoolclosed = errors.new("pool has been closed")
func new(fn func() (io.closer, error), size uint) (*pool, error)
return &pool, nil
}// get a resource
func (p *pool) acquire() (io.closer, error)
return r, nil
default:
log.println("acquire:", "new resource")
return p.factory() }}
// release to reasoure
func (p *pool) release(r io.closer)
select
}// close
func (p *pool) close()
p.closed = true
close(p.resources)
for r := range p.resources
return
}
讀《Go 語言實戰》
英文版書名 go in action william kennedy brian ketelsen eirk st.martin 著2017年3月 第 1 版 go 語言是現代的,快速的,帶有乙個強大的標準庫。內建對併發的支援 使用介面作為 復用的基礎模組。一,go語言介紹 二,快速開始乙個go程式...
GO語言實戰十 管道
不要通過共享記憶體來通訊,而應該通過通訊來共享記憶體 channel 也是go語言裡的一種引用型別,通道可以被認為是goroutines通訊的管道。類似於管道中的水從一端到另一端的流動,資料可以從一端傳送到另一端,通過通道接收。當乙個資源需要在 goroutine 之間共享時,通道在 gorouti...
go語言實戰筆記 二
碼 之前一定要安裝go,哈哈哈哈,反正我只裝goland然後寫不了 報錯,卡在第一段 哈哈哈哈哈哈 新建專案goproject 新建src資料夾 新建main資料夾 新建第乙個go檔案 開始寫 好了,我用一秒鐘的時間寫完了下面的 package main import bufio fmt os my...