成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 的零值有什么用?看看這四個場景

開發 前端
零值,在 Go 里雖然是一個缺省值。但它本質上不僅僅是一個 “缺省”,它還在 Go 程序里的許多應用場景提供了不少的便捷特性,甚至是隱晦的功能。

背景

Go 語言中有一個有些特殊的概念,叫做零值。許多轉語言的同學經常會弄混淆,一開始會不適應。

代碼如下:

func main() {
var i int
var f float64
var b bool
var s string
fmt.Printf("%v %v %v %q\n", i, f, b, s)
}

輸出結果:

0 0 false ""

這會導致大家在定義各種數據庫字段時比較糾結,又會說 Go 這零值,例如:整型的零值 0,跟數據庫里的 0 枚舉值沖突。又或是做入參判斷時怎么區別開?

一時半會想不明白,為什么 Go 要定義這個零值來增加復雜度?

有什么用

官方詮釋

Go 核心團隊的 @Dave Cheney 在《What is the zero value, and why is it useful?[1]》中對零值進行了詳細的闡釋,以下部分為該文的展開介紹。

將一個值設置為已知默認值的特性,對于程序的安全性和正確性非常重要。可以使你的 Go 程序更加簡單和緊湊。這就是 Go 程序員常說的 "給你的結構一個有用的零值"。

官方案例

以下是 Go 官方給出的幾個零值的例子,非常具有代表性。分別是:

  • sync.Mutex。
  • byte.Buffer。
  • slices。
  • nil func。

Sync.Mutex

sync.Mutex 被設計為無需顯式初始化就可以使用,可以實現這個功能的原因是 sync.Mutex 包 含兩個未導出的整數字段。

用大白話講,就是由于零值的存在,只要聲明了 sync.Mutex,這些字段就會被設置為 0(值會被初始化)。

因此可以無需顯式初始化就可以開箱即用。

如下代碼:

package main

import "sync"

type MyInt struct {
mu sync.Mutex
val int
}

func main() {
var i MyInt

// i.mu is usable without explicit initialisation.
i.mu.Lock()
i.val++
i.mu.Unlock()
}

Byte.Buffer

因為有零值的存在,bytes.Buffer 在進行寫入或讀取的操作時,不需要人為的進行明確的初始化。也能做到很好的開箱即用。

如下代碼:

package main

import "bytes"
import "io"
import "os"

func main() {
var b bytes.Buffer
b.Write([]byte("Hello world"))
io.Copy(os.Stdout, &b)
}

注:io.Copy 需要一個 io.Reader 作為它的第二個參數,所以我們需要傳遞一個指向 b 的指針。

Slices

在 slices 的定義中,它的零值是 nil。這意味著你不需要顯式定義一個 slices,只需要直接聲明它,就可以使用了。

如下:

package main

import "fmt"
import "strings"

func main() {
// s := make([]string, 0)
// s := []string{}
var s []string

s = append(s, "Hello")
s = append(s, "world")
fmt.Println(strings.Join(s, " "))
}

Nil func

你可以在有 nil 值的類型上調用方法,這也是零值作為缺省值的作用之一。

這個場景,甚至一度讓許多 Go 程序員以為是 BUG,我還專門寫過文章。這是可行的,其實是零值的延伸出來的用法。

如下代碼:

package main

import "fmt"

type Config struct {
path string
}

func (c *Config) Path() string {
if c == nil {
return "/usr/home"
}
return c.path
}

func main() {
var c1 *Config
var c2 = &Config{
path: "/export",
}
fmt.Println(c1.Path(), c2.Path())
}

總結

零值,在 Go 里雖然是一個缺省值。但它本質上不僅僅是一個 “缺省”,它還在 Go 程序里的許多應用場景提供了不少的便捷特性,甚至是隱晦的功能。

希望本文對你對零值的理解有進一步的幫助!

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2023-11-06 12:10:28

2019-10-29 14:54:20

Kafka消息系統分布式

2021-10-13 06:03:12

網絡帶寬卡頓

2021-11-17 10:35:34

零信任安全網絡安全網絡攻擊

2018-06-29 15:07:13

代碼工程師軟件開發

2022-04-13 15:35:56

交互方案設計師用戶

2015-10-30 10:23:27

創業選擇思考問題

2015-04-15 11:31:14

智能硬件智能家居

2024-10-10 11:49:27

2022-01-27 15:48:05

區塊鏈金融技術

2016-12-09 13:08:25

2021-11-15 10:10:20

安全零信任數據

2021-10-29 16:28:03

零信任網絡安全網絡攻擊

2015-08-13 10:49:33

WLAN無線局域網

2015-11-19 09:24:18

應用程序Docker容器化

2017-05-16 11:09:56

2024-06-14 08:11:33

Spring技巧開發

2024-06-20 18:15:55

2021-10-11 09:30:21

零信任網絡安全網絡攻擊

2018-10-22 20:36:59

搜索設計功能搜索框
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久草视频 | 中文字幕一区在线观看视频 | 日韩av高清| 日韩福利片 | 91精品麻豆日日躁夜夜躁 | a级在线免费 | 在线免费亚洲视频 | 国产精品久久久久久久久久久久久久 | 精品国产欧美一区二区 | 久久夜视频 | 99视频免费在线观看 | 韩国毛片一区二区三区 | www.av在线| 国产在线一区二区三区 | 成人一区二区三区在线观看 | 精品国产乱码久久久久久88av | 成人黄色av网址 | 国产视频1区 | 午夜精品一区二区三区在线播放 | 亚洲一区二区中文字幕在线观看 | 亚洲永久| 超碰97免费在线 | 在线观看成人免费视频 | 国精产品一区一区三区免费完 | 成人av免费在线观看 | av一二三区 | 福利视频亚洲 | 亚洲国产精品久久 | 亚洲精品久久久蜜桃 | 成人午夜免费视频 | 国产在线视频一区二区董小宛性色 | 国产视频二区在线观看 | 欧美精品第一页 | 亚洲少妇综合网 | 国产 欧美 日韩 一区 | 婷婷在线免费 | 亚洲精品在线观 | 黄色一级免费 | 欧美专区日韩 | 成人精品在线观看 | 日韩网站免费观看 |