真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

golang中nil怎么用-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“golang中nil怎么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“golang中nil怎么用”這篇文章吧。

在宣漢等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計制作、成都做網(wǎng)站 網(wǎng)站設(shè)計制作定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,宣漢網(wǎng)站建設(shè)費用合理。

golang中的nil,很多人都誤以為與Java、PHP等編程語言中的null一樣。但是實際上Golang的niu復(fù)雜得多了,如果不信,那我們繼續(xù)往下閱讀。

nil 為預(yù)聲明的標(biāo)示符,定義在builtin/builtin.go

// nil is a predeclared identifier representing the zero value for a// pointer, channel, func, interface, map, or slice type.// Type must be a pointer, channel, func, interface, map, or slice typevar nil Type 

// Type is here for the purposes of documentation only. It is a stand-in// for any Go type, but represents the same type for any given function// invocation.type Type int

nil的零值

按照Go語言規(guī)范,任何類型在未初始化時都對應(yīng)一個零值:布爾類型是false,整型是0,字符串是"",而指針、函數(shù)、interface、slice、channel和map的零值都是nil。

PS:這里沒有說結(jié)構(gòu)體struct的零值為nil,因為struct的零值與其屬性有關(guān)

nil沒有默認(rèn)的類型,盡管它是多個類型的零值,必須顯式或隱式指定每個nil用法的明確類型。

package main

func main() {

	// 明確.
	_ = (*struct{})(nil)
	_ = []int(nil)
	_ = map[int]bool(nil)
	_ = chan string(nil)
	_ = (func())(nil)
	_ = interface{}(nil)

	// 隱式.
	var _ *struct{} = nil
	var _ []int = nil
	var _ map[int]bool = nil
	var _ chan string = nil
	var _ func() = nil
	var _ interface{} = nil
}

如果關(guān)注過golang關(guān)鍵字的同學(xué)就會發(fā)現(xiàn),里面并沒有nil,也就是說nil并不是關(guān)鍵字,那么就可以在代碼中定義nil,那么nil就會被隱藏。

package mainimport "fmt"func main() {	
        nil := 123
	fmt.Println(nil) // 123
	var _ map[string]int = nil //cannot use nil (type int) as type map[string]int in assignment
}

nil類型的地址和值大小

nil類型的所有值的內(nèi)存布局始終相同,換一句話說就是:不同類型nil的內(nèi)存地址是一樣的。

package main
import (
	"fmt"
)
func main() {
	var m map[int]string
	var ptr *int
	var sl []int
	fmt.Printf("%p\n", m)       //0x0
	fmt.Printf("%p\n", ptr )    //0x0
	fmt.Printf("%p\n", sl )     //0x0
}

業(yè)務(wù)中一般將nil值表示為異常。nil值的大小始終與其類型與nil值相同的non-nil值大小相同。因此, 表示不同零值的nil標(biāo)識符可能具有不同的大小。

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	var p *struct{} = nil
	fmt.Println( unsafe.Sizeof( p ) ) // 8

	var s []int = nil
	fmt.Println( unsafe.Sizeof( s ) ) // 24

	var m map[int]bool = nil
	fmt.Println( unsafe.Sizeof( m ) ) // 8

	var c chan string = nil
	fmt.Println( unsafe.Sizeof( c ) ) // 8

	var f func() = nil
	fmt.Println( unsafe.Sizeof( f ) ) // 8

	var i interface{} = nil
	fmt.Println( unsafe.Sizeof( i ) ) // 16
}

大小是編譯器和體系結(jié)構(gòu)所依賴的。以上打印結(jié)果為64位體系結(jié)構(gòu)和正式 Go 編譯器。對于32位體系結(jié)構(gòu), 打印的大小將是一半。

對于正式 Go 編譯器, 同一種類的不同類型的兩個nil值的大小始終相同。例如, 兩個不同的切片類型 ( []int和[]string) 的兩個nil值始終相同。

nil值比較

1.不同類型的nil是不能比較的。

package main
import (
	"fmt"
)
func main() {
	var m map[int]string
	var ptr *int
	fmt.Printf(m == ptr) //invalid operation: m == ptr (mismatched types map[int]string and *int)
}

在 Go 中, 兩個不同可比較類型的兩個值只能在一個值可以隱式轉(zhuǎn)換為另一種類型的情況下進(jìn)行比較。具體來說, 有兩個案例兩個不同的值可以比較:

  • 兩個值之一的類型是另一個的基礎(chǔ)類型。

  • 兩個值之一的類型實現(xiàn)了另一個值的類型 (必須是接口類型)。

nil值比較并沒有脫離上述規(guī)則。

package main
import (
	"fmt"
)
func main() {
	type IntPtr *int
	fmt.Println(IntPtr(nil) == (*int)(nil))			//true
	fmt.Println((interface{})(nil) == (*int)(nil))	//false
}

2.同一類型的兩個nil值可能無法比較 因為golang中存在map、slice和函數(shù)類型是不可比較類型,它們有一個別稱為不可比擬的類型,所以比較它們的nil亦是非法的。

package main
import (
	"fmt"
)
func main() {
	var v1 []int = nil
	var v2 []int = nil
	fmt.Println(v1 == v2)
	fmt.Println((map[string]int)(nil) == (map[string]int)(nil))
	fmt.Println((func())(nil) == (func())(nil))
}

不可比擬的類型的值缺是可以與“純nil”進(jìn)行比較。

package main
import (
	"fmt"
)
func main() {
	fmt.Println((map[string]int)(nil) == nil)  //true
	fmt.Println((func())(nil) == nil)		   //true
}

3.兩nil值可能不相等

如果兩個比較的nil值之一是一個接口值, 而另一個不是, 假設(shè)它們是可比較的, 則比較結(jié)果總是 false。原因是在進(jìn)行比較之前, 接口值將轉(zhuǎn)換為接口值的類型。轉(zhuǎn)換后的接口值具有具體的動態(tài)類型, 但其他接口值沒有。這就是為什么比較結(jié)果總是錯誤的。

package main
import (
	"fmt"
)
func main() {
	fmt.Println( (interface{})(nil) == (*int)(nil) ) // false
}

常見問題

1.函數(shù)返回

func nilReturn() (string,error)  {

	return nil,nil  //cannot use nil as type string in return argument
}

因為error是接口類型所以error類型沒有報錯。

2.map的nil key map的key為指針、函數(shù)、interface、slice、channel和map,則key可以為nil。

package main
import (
	"fmt"
)
func main() {
	mmap := make(map[*string]int,4)
	a:="a"
	mmap[&a] = 1
	mmap[nil] = 99
	fmt.Println(mmap)   //map[0xc042008220:1 :99]
}

以上是“golang中nil怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


新聞標(biāo)題:golang中nil怎么用-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://weahome.cn/article/joeop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部