欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go空結(jié)構(gòu)體struct{}的作用是什么

 更新時(shí)間:2023年02月16日 09:07:18   作者:勁仔Go  
本文主要介紹了Go空結(jié)構(gòu)體struct{}的作用是什么,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

通過這篇文章《淺談Go結(jié)構(gòu)體的基本使用》,我們初步認(rèn)識(shí)了空結(jié)構(gòu)體,使用unsafe.SizeOf()方法,明確知道了空結(jié)構(gòu)體,它不占用存儲(chǔ)空間(即“寬度”為0,寬度描述了一個(gè)類型的實(shí)例所占用的存儲(chǔ)空間的字節(jié)數(shù))

s := struct{}{}
fmt.Println(unsafe.Sizeof(s)) //0

在項(xiàng)目代碼中,我們經(jīng)常都會(huì)看到空結(jié)構(gòu)體struct{}{}的使用,所以肯定背后有一定的原因。那究竟它有什么作用,適合什么場(chǎng)景使用呢?

作用

因?yàn)榭战Y(jié)構(gòu)體不占據(jù)內(nèi)存空間,因此被廣泛作為各種場(chǎng)景下的占位符使用。一是節(jié)省資源,二是空結(jié)構(gòu)體本身就具備很強(qiáng)的語(yǔ)義,即這里不需要任何值,僅作為占位符

使用場(chǎng)景

主要使用場(chǎng)景有3個(gè)

  • 實(shí)現(xiàn)集合類型
  • 實(shí)現(xiàn)空通道
  • 實(shí)現(xiàn)方法接收者

實(shí)現(xiàn)集合類型

Go語(yǔ)言本身是沒有集合類型(Set),通常是使用map來替代。

但有個(gè)問題,就是集合類型,只需要用到key(鍵),不需要用到value(值)

如果value使用bool來表示,實(shí)際會(huì)占用1個(gè)字節(jié)的空間,為了節(jié)省空間,這時(shí)空結(jié)構(gòu)體就可以大顯身手了

type Set map[int]struct{}

func main() {
  s := make(Set)
  s.add(1)
  s.add(2)
  s.add(3)
  s.remove(2)
  fmt.Println(s.exist(1))
  fmt.Println(s)

  //輸出:
  //true
  //map[1:{} 3:{}]
}
func (s Set) add(num int) {
  s[num] = struct{}{}
}
func (s Set) remove(num int) {
  delete(s, num)
}
func (s Set) exist(num int) bool {
  _, ok := s[num]
  return ok
}

空結(jié)構(gòu)體作為占位符,不會(huì)額外增加不必要的內(nèi)存開銷,很方便的就把問題給解決了

實(shí)現(xiàn)空通道

在Go的channel 的使用場(chǎng)景中,常常會(huì)遇到通知型 channel,其不需要發(fā)送任何數(shù)據(jù),只是用于協(xié)調(diào) Goroutine 的運(yùn)行,用于流轉(zhuǎn)各類狀態(tài)或是控制并發(fā)情況。

這類情況就特別適合使用空結(jié)構(gòu)體,只做個(gè)占位,不浪費(fèi)內(nèi)存空間

func main() {
  ch := make(chan struct{})
  go worker(ch)

  // Send a message to a worker.
  ch <- struct{}{}

  // Receive a message from the worker.
  <-ch
  println("AAA")

  //輸出:
  //BBB
  //AAA
}

func worker(ch chan struct{}) {
  // Receive a message from the main program.
  <-ch
  println("BBB")

  // Send a message to the main program.
  close(ch)
}

由于該 channel 使用的是空結(jié)構(gòu)體,因此也不會(huì)帶來額外的內(nèi)存開銷

實(shí)現(xiàn)方法接收者

使用結(jié)構(gòu)體類型的變量作為方法接收者,有時(shí)結(jié)構(gòu)體可以不包含任何字段屬性。這種情況,可以用int或者string來替代,但它們都會(huì)占用內(nèi)存空間,所以繼續(xù)使用空結(jié)構(gòu)體是比較合適的。

并且也有利于未來針對(duì)該類型進(jìn)行公共字段等的增加,容易擴(kuò)展和維護(hù)

type T struct{}

func methodUse() {
  t := T{}
  t.Print()
  t.Print2()

  //輸出:
  //哈哈哈Print
  //哈哈哈Print2
}

func (t T) Print() {
  fmt.Println("哈哈哈Print")
}
func (t T) Print2() {
  fmt.Println("哈哈哈Print2")
}

總結(jié)

針對(duì)空結(jié)構(gòu)體的作用和使用場(chǎng)景,進(jìn)行了詳細(xì)的講解。在之后的實(shí)際項(xiàng)目開發(fā)過程中,只用占位不用實(shí)際含義,那么我們就都可以使用空結(jié)構(gòu)體,可以極大的節(jié)省不必要的內(nèi)存開銷。

到此這篇關(guān)于Go空結(jié)構(gòu)體struct{}的作用是什么的文章就介紹到這了,更多相關(guān)Go空結(jié)構(gòu)體struct{}內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言kylin任務(wù)自動(dòng)化實(shí)例詳解

    Go語(yǔ)言kylin任務(wù)自動(dòng)化實(shí)例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言kylin任務(wù)自動(dòng)化實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼

    GO語(yǔ)言實(shí)現(xiàn)二維碼掃碼的示例代碼

    你對(duì)二維碼掃碼的流程有困惑嗎,這篇文章就結(jié)合筆者自身的開發(fā)經(jīng)驗(yàn)進(jìn)行分享,讓大家熟悉并掌握此功能,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-06-06
  • 詳解Golang中零拷貝的原理以及實(shí)踐

    詳解Golang中零拷貝的原理以及實(shí)踐

    零拷貝技術(shù)相信大家都有所耳聞,但是本文不僅會(huì)講述零拷貝技術(shù)的原理,并將從實(shí)際代碼出發(fā),看看零拷貝技術(shù)在golang中的應(yīng)用,現(xiàn)在讓我們開始吧
    2023-07-07
  • Go語(yǔ)言eclipse環(huán)境搭建圖文教程

    Go語(yǔ)言eclipse環(huán)境搭建圖文教程

    這篇文章主要介紹了Go語(yǔ)言eclipse環(huán)境搭建的方法,結(jié)合圖文形式詳細(xì)分析了在eclipse環(huán)境下開發(fā)Go語(yǔ)言所涉及的組件下載、安裝及相關(guān)設(shè)置方法,需要的朋友可以參考下
    2016-07-07
  • 簡(jiǎn)單了解Go語(yǔ)言中函數(shù)作為值以及函數(shù)閉包的使用

    簡(jiǎn)單了解Go語(yǔ)言中函數(shù)作為值以及函數(shù)閉包的使用

    這篇文章主要介紹了簡(jiǎn)單了解Go語(yǔ)言中函數(shù)作為值以及函數(shù)閉包的使用,是golang入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • Golang項(xiàng)目在github創(chuàng)建release后自動(dòng)生成二進(jìn)制文件的方法

    Golang項(xiàng)目在github創(chuàng)建release后自動(dòng)生成二進(jìn)制文件的方法

    這篇文章主要介紹了Golang項(xiàng)目在github創(chuàng)建release后如何自動(dòng)生成二進(jìn)制文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • GOLANG使用Context實(shí)現(xiàn)傳值、超時(shí)和取消的方法

    GOLANG使用Context實(shí)現(xiàn)傳值、超時(shí)和取消的方法

    這篇文章主要介紹了GOLANG使用Context實(shí)現(xiàn)傳值、超時(shí)和取消的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Go語(yǔ)言七篇入門教程五文件及包

    Go語(yǔ)言七篇入門教程五文件及包

    本章節(jié)主要介紹go語(yǔ)言的文件處理與包管理,本文是Go語(yǔ)言七篇入門教程系列篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Golang Cron 定時(shí)任務(wù)的實(shí)現(xiàn)示例

    Golang Cron 定時(shí)任務(wù)的實(shí)現(xiàn)示例

    這篇文章主要介紹了Golang Cron 定時(shí)任務(wù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Go語(yǔ)言中io包核心接口示例詳解

    Go語(yǔ)言中io包核心接口示例詳解

    Go的io包提供了io.Reader和io.Writer接口,分別用于數(shù)據(jù)的輸入和輸出,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中io包核心接口的相關(guān)資料,需要的朋友可以參考下
    2021-12-12

最新評(píng)論