go語言 空結構體 chan struct

2021-10-07 10:36:44 字數 3382 閱讀 4701

空結構體的寬度是0,占用了0位元組的記憶體空間。

var s struct{}

fmt.println(unsafe.sizeof(s)) // prints 0

由於空結構體占用0位元組,那麼空結構體也不需要填充位元組。所以空結構體組成的組合資料型別也不會占用記憶體空間。

type s struct 

b struct{}

}var s s

fmt.println(unsafe.sizeof(s)) // prints 0

0人點贊

go

通過訊息來共享資料是golang的一種設計哲學,channel則是這種哲理的體現。

golang中的空結構體 channel := make(chan struct{})特點

常用用法

通常struct{}型別channel的用法是使用同步,一般不需要往channel裡面寫資料,只有讀等待,而讀等待會在channel被關閉的時候返回。

type miner struct

stopping chan

struct

waitfunc waitfunc

lastwork *miningbase

minedblockheights *lru.arccache

}

stop 它是乙個管道chan,內部的資料型別是struct{}。

單獨拿struct{}來說,我們熟悉type name struct這樣去定義乙個結構體的型別,其實struct就是定義結構體,和map[string]int這種定義是一樣的,type只是給它取了乙個別名。總結: 實際上struct{}就是一種普通資料型別,只是沒有具體的值而已。

注意,channel物件一定要make出來才能使用。, 如下,make後賦值給m

func

(m *miner)

start

(ctx context.context)

error

m.stop =

make

(chan

struct

)go m.

mine

(context.

todo()

)return

nil}

func

(m *miner)

stop

(ctx context.context)

error

) stopping := m.stopping

close

(m.stop)

select

}

使用場景

首先事件通知,可以通過寫入 通知其他協程,但是只能通知乙個。

channel := make(chan struct{})

go func() {}

}()fmt.println(<-channel)

和close進行配合,通知所有相關協程。

在讀入被close的channel返回零值,正常的協程是讀取不到這個close的。

close之後,所有協程都可以讀到。

比較經典的例子就是用於stopchan作為停止channel通知所有協程。

在下面的例子中 我們可以通過s.stop()通知所有的serverhandler協程停止工作,並且等待他們正常退出。

type server struct

stopwg sync.waitgroup

}func

(s *server)

stop()

close

(s.serverstopchan)

s.stopwg.

wait()

s.serverstopchan =

nil}

func

serverhandler

(s *server)

}}

另外也可以定義帶緩衝的channel

package main

import

("time"

"log"

)var ch chan

struct

=make

(chan

struct,2

)func

foo(

) log.

println

("foo() 000");

ch <-

struct

log.

println

("foo() 111");

time.

sleep(5

* time.second)

log.

println

("foo() 222");

close

(ch)

log.

println

("foo() 333");

}func

main()

log.

println

("main() 111");

gofoo()

log.

println

("main() 222");

a :=

<-ch

log.

println

("main() 333"

, a)

; b =

<-ch

log.

println

("main() 444"

, b)

; c :=

<-ch

log.

println

("main() 555"

, c)

;}

<-ch用來從channel ch中接收資料,這個表示式會一直被block,直到有資料可以接收。

從乙個nil channel中接收資料會一直被block。(往nil channel中傳送資料會一致被阻塞著。)

從乙個被close的channel中接收資料不會被阻塞,而是立即返回,接收完已傳送的資料後會返回元素型別的零值(zero value)。

如前所述,你可以使用乙個額外的返回引數來檢查channel是否關閉。

x, ok := <-ch

x, ok = <-ch

var x, ok = <-ch

如果ok 是false,表明接收的x是產生的零值,這個channel被關閉了或者為空。

Go 空結構體struct 作用

package main import fmt unsafe func main 空結構體的例項和作用 func empstruct var s1 struct fmt.println 空結構體占用記憶體的情況 unsafe sizeof s fmt.printf 空結構體指標指向情況 s p,s1...

go語言結構體

go語言陣列可以儲存同一型別的資料 但在結構體中我們可以為不同項定義不同的資料型別 結構體是由一系列具有相同的型別或者不同型別的資料構成的資料集合 1.定義結構體 結構體定義需要使用type和struct語句。struct語句定義乙個新的資料型別,結構體中有乙個或者多個成員。type語句設定了結構體...

GO語言結構體

go語言的struct和c語言的很相似 簡單的struct定義 package main import fmt type test struct func main fmt.println a 或者 package main import fmt type test struct func main...