Go語言高階程式設計之面向記憶體的併發模型

2021-09-26 23:26:25 字數 2862 閱讀 5631

package main

import (

"fmt"

"sync"

)var total struct

func worker(group * sync.waitgroup)

}func main()

上面**是粗粒度的原子操作

但標準庫提供了sync/atomic包對原子操作提供了豐富的支援

package main

import (

"fmt"

"sync"

"sync/atomic"

)var num uint64

func atomicworker(wg *sync.waitgroup)

}func main()

package main

import (

"sync/atomic"

"time"

)var config atomic.value

//載入資訊

func main()

}()for i :=0; i <= 100; i++

} }}

package main

import "fmt"

func main() ()

<-done

}

上述**保證了go func() 的 done <-1 執行完之後,<-done才執行,也就是goroutine執行完之後,main才會結束執行

func mutexlock() ()

lock.lock()

}

可以確定後台執行緒的mu.unlock()必然在println(「你好, 世界」)完成後發生(同乙個執行緒滿足順序一致性),main函式的第二個mu.lock()必然在後台執行緒的mu.unlock()之後發生(sync.mutex保證),此時後台執行緒的列印工作已經順利完成了。

第二次加鎖的時候因為鎖已經被占用了,因此會阻塞

main函式的阻塞狀態將會驅動後台執行緒繼續向前執行

與一般的通過加鎖和原子操作不同,go是使用無快取的管道來實現不同goroutine之間的通訊的

從無快取channel進行的接收,發生在對該channel進行的傳送完成之前

func main() ()

done <- 1

}

有2種實現方法

package main

import (

"fmt"

"sync"

)func controlv1() ()

} wg.wait()

}func controlv2()

for i:=0; i < 10; i++

}func main()

package main

import (

"fmt"

"os"

"os/signal"

"syscall"

)func producer (factor int, out chan <- int)

}func consumer (in <-chan int)

}func main ()

package main

import (

"fmt"

"strings"

"sync"

"time"

)//定義資料型別

type (

subscriber chan inte***ce{} //訂閱者是通道

filterfunc func(v inte***ce{}) bool

)type publisher struct

//構建新的publisher

func newpublisher(publishertimeout time.duration, buffer int)*publisher

}func (p *publisher) subscribetopic(topic filterfunc) chan inte***ce{} , p.buffer)

p.m.lock()

p.subscribers[ch] = topic

p.m.unlock()

return ch

}func (p *publisher) subscribe() chan inte***ce{}

//退出訂閱

func (p *publisher) evict(subscriber chan inte***ce{})

func (p *publisher) publish(v inte***ce{})

wg.wait()

}func (p *publisher) sendtopic(sub subscriber,

topic filterfunc,

v inte***ce{},

wg *sync.waitgroup)

select

}func (p *publisher) close()

}func main()) bool

return false

}) p.publish("hello world")

p.publish("hello, golang")

go func()

}()go func()

}()time.sleep(3*time.second)

}

Go之物件導向程式設計之繼承

golang的繼承與j a和php不太一樣,如php繼承需要用到extends關鍵字,而golang使用的是匿名繼承或有名繼承。二 簡單舉例 package main import fmt type brand struct type goods struct func main 結果 go run...

go語言之高階篇物件導向程式設計

1 物件導向程式設計 對於物件導向程式設計的支援go 語言設計得非常簡潔而優雅。因為,go語言並沒有沿襲傳統物件導向程式設計中的諸多概念,比如繼承 不支援繼承,儘管匿名欄位的記憶體布局和行為類似繼承,但它並不是繼承 虛函式 建構函式和析構函式 隱藏的this指標等。儘管go語言中沒有封裝 繼承 多型...

GO語言使用之物件導向程式設計 3 方法

在某些情況下,我們要需要宣告 定義 方法。比如person結構體 除了有一些欄位外 年齡,姓名.person結構體還有一些行為比如 可以說話 跑步.通過學習,還可以做算術題。這時就要用方法才能完成。golang中的方法是作用在指定的資料型別上的 即 和指定的資料型別繫結 因此自定義型別,都可以有方法...