亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言變量初始化的實現(xiàn)示例

 更新時間:2024年04月01日 08:59:33   作者:The-Venus  
在Go語言中,變量的初始化是編寫程序時經(jīng)常遇到的重要操作之一,本文主要介紹了Go語言變量初始化的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下

引言

在Go語言中,變量的初始化是編寫程序時經(jīng)常遇到的重要操作之一。

通過正確地初始化變量,我們可以確保程序的正確性和可讀性,并且能夠避免一些常見的錯誤。

Go語言提供了多種初始化變量的方法,包括使用var關(guān)鍵字、短變量聲明以及在聲明時提供初始值等方式。

本文將介紹如何在Go語言中進(jìn)行變量的初始化,并提供一些示例以更好地理解這些概念。

舉例

在Go語言中,變量的初始化可以使用var關(guān)鍵字或短變量聲明,并且可以同時聲明和初始化變量。下面是一些示例:

1.使用var關(guān)鍵字聲明和初始化變量:

var x int = 10
var str string = "Hello, world!"

2.使用短變量聲明方式:

x := 10
str := "Hello, world!"

3.多個變量同時聲明和初始化:

var a, b, c int = 1, 2, 3
var str1, str2 string = "foo", "bar"

4.如果聲明變量時未提供初始值,則變量會被初始化為其類型的零值:

var num int  // num被初始化為0
var str string  // str被初始化為空字符串""

5.在函數(shù)內(nèi)部,可以使用短變量聲明的方式初始化變量:

func main() {
    x := 10
    str := "Hello, world!"
    fmt.Println(x, str)
}

在Go中,變量的初始化是一種常見且重要的操作,它使得代碼更加清晰易懂,并且有助于避免潛在的錯誤。

多個變量同時賦值

在Go語言中,可以使用多個變量同時進(jìn)行賦值。這可以通過使用簡短變量聲明(short variable declaration)或使用賦值語句來實現(xiàn)。

1.使用簡短變量聲明方式:

x, y := 10, 20
str1, str2 := "Hello", "World"

2.使用賦值語句同時給多個變量賦值:

var a, b int
a, b = 10, 20

3.交換兩個變量的值:

x, y := 10, 20
x, y = y, x // 交換x和y的值

4.同時聲明和賦值多個變量:

var (
    name  = "John"
    age   = 30
    email = "john@example.com"
)

Go 語言還提供了兩個專門用于數(shù)據(jù)初始化的內(nèi)建函數(shù) new 和 make。

1. 內(nèi)建函數(shù) new

new 函數(shù)用于為值分配內(nèi)存。與其他編程語言(如 Java)中的 new 不同的是,它并不會去初始化分配到的內(nèi)存,而只會清零它。因此調(diào)用表達(dá)式 new(T) 被求值時,所做的是為 T 類型的新值分配并清零一塊內(nèi)存空間,然后將這塊內(nèi)存空間的地址作為結(jié)果返回。而這個結(jié)果就是指向這個新的 T 類型值的指針值。它的類型為 *T。實際上這個 new 函數(shù)返回的 *T 類型值總會指向一個 T 類型的零值。

例如,調(diào)用表達(dá)式 new(string) 的求值結(jié)果指向的是一個 string 類型的零值 "",而調(diào)用表達(dá)式 new([3]int) 的求值結(jié)果指向的則是一個 [3]int 類型的零值 [3]int{0, 0, 0}。

正因為有這種干凈的內(nèi)存分配策略,使得我們可以在用內(nèi)建函數(shù) new 創(chuàng)建某個數(shù)據(jù)類型的新值之后立刻就可以拿來使用,而不用擔(dān)心在這個值中會遺留某些初始化的痕跡。

下面我們以標(biāo)準(zhǔn)庫代碼包 bytes 中的結(jié)構(gòu)體類型 Buffer 為例介紹以下:

bytes.Buffer 是一個尺寸可變的字節(jié)緩沖區(qū)。它的零值就是一個立即可用的空緩沖區(qū)。因此,調(diào)用表達(dá)式 new(bytes.Buffer) 的求值結(jié)果就是一個指向一個空緩沖區(qū)的指針值。然后,我們就可以立即在這個緩沖區(qū)上進(jìn)行讀寫操作了。

標(biāo)準(zhǔn)庫代碼包 sync 中的結(jié)構(gòu)體類型 Mutex 也是一個可以 new 后即用的數(shù)據(jù)類型。它的零值就是一個處于未鎖定狀態(tài)的互斥量。

內(nèi)建函數(shù) new 的這種特性為我們提供了一個關(guān)于自定義數(shù)據(jù)類型的可參考的設(shè)計規(guī)則:

例如,在我們自定義一個結(jié)構(gòu)體類型的時候就要考慮到,在其中的每個字段的值都分別為對應(yīng)類型的零值的時候,這個結(jié)構(gòu)體值就應(yīng)該已經(jīng)處于可用的狀態(tài)。這樣,我們在 new 它的時候就能夠得到一個立即可用的值的指針值,而不需要再做額外的初始化。

當(dāng)然,在感覺一個類型的零值還無法讓它變得可用的時候,我們可以使用相應(yīng)的字面量來達(dá)到分配內(nèi)存空間并初始化值的目的。

前面我們已經(jīng)講過,我們可以在字面量中靈活的指定新值中的每一個元素的值。但是要注意,字面量所代表的是該類型的值,而不是指向該類型值的指針值。 因此,我們在將它們與調(diào)用 new 函數(shù)的調(diào)用表達(dá)式做等價替換的時候,還需要在字面量的前面加入取址操作符 & 以表示指向該類型值的指針值。

2. 內(nèi)建函數(shù) make

與 new 不同的是,make 函數(shù)只能被用于創(chuàng)建 切片類型、字典類型 和 通道類型 的值,并返回一個已被初始化的(即非零值的)的對應(yīng)類型的值。

那 make 函數(shù)為啥要這樣做呢?

在之前的博文中我們介紹過,這 3 個復(fù)合類型都是引用類型。在它們的每一個值的內(nèi)部都會保持著一個對某個底層數(shù)據(jù)結(jié)構(gòu)值的引用。如果不對它們的值進(jìn)行初始化,那么其中的這種引用關(guān)系是不會被建立起來的,同時相關(guān)的內(nèi)部值也會不正確。在這種情況下,該類型的值也就不能夠被使用,因為它們是不完整的,還處于未就緒的狀態(tài)。這就意味著,在創(chuàng)建這 3 個引用類型的值的時候,必須將內(nèi)存空間分配和數(shù)據(jù)初始化這兩個步驟綁定在一起。也正是為了保證這些值的可用性,切片類型、字典類型 和 通道類型的零值都是 nil,不是那個未被初始化的值。因此,當(dāng)我們 new 這 3 個引用類型并想創(chuàng)建它們的值的時候,得到的卻是一個指向空值 nil 的指針值。

除此之外,內(nèi)建函數(shù) make 所接受的參數(shù)也與 new 函數(shù)有所不同。make 函數(shù)除了會接受一個表示目標(biāo)類型的類型字面量之外,還會接受一個或兩個額外的參數(shù)。

對于 切片類型 來說,我們可以在把新值的長度和容量也傳遞給 make 函數(shù)。例如:

// 調(diào)用表達(dá)式創(chuàng)建了一個新的 []int 類型的值,這個值的長度為10、容量為100
make([]int, 10, 100)

當(dāng)然,我們也可以省略掉最后一個參數(shù),即不指定新值的容量。這種情況下,該值的容量會與其長度一致。示例如下:

// 變量s的類型是[]int的,而長度和容量都是10。
s := make([]int,10)

在使用 make 函數(shù)初始化一個切片值的過程中,該值會引用一個長度與其容量相同且元素類型與其元素類型一致的數(shù)組值。這個數(shù)組值就是該切片值的底層數(shù)組。該數(shù)組值中的每個元素都是當(dāng)前元素類型的零值。但是,切片值只會展現(xiàn)出數(shù)量與其長度相同的元素。因此,調(diào)用表達(dá)式 make([]int,10,100) 所創(chuàng)建并初始化的值就是 []int{0 0 0 0 0 0 0 0 0 0}。

我們在使用 make 函數(shù)創(chuàng)建字典類型的值的時候,也可以指定其底層數(shù)據(jù)結(jié)構(gòu)的長度。但是,該字典值只會展示出我們明確放入的鍵值對。例如:

// 調(diào)用如下表達(dá)式,所創(chuàng)建和初始化的值會是 map[string]int
make(map[string]int,100)

// 也可以忽略掉那個用于表示底層數(shù)據(jù)結(jié)構(gòu)長度的參數(shù)
make(map[ string]int)

雖然我們也可以忽略掉那個用于表示底層數(shù)據(jù)結(jié)構(gòu)長度的參數(shù) ,但是還是建議:

應(yīng)該在性能敏感的應(yīng)用場景下,根據(jù)這個字典值可能包含的鍵值對的數(shù)量以及放入它們的時間,仔細(xì)地設(shè)置該長度參數(shù)。

最后我們簡單介紹以下對于 通道類型(Channel) 的值的數(shù)據(jù)初始化。到此目前為止,我們還沒有對通道類型進(jìn)行過任何說明。不過,在后續(xù)的博文中,我們會詳細(xì)講解這個特殊的引用類型。

// 使用make函數(shù)創(chuàng)建一個通道類型的值
make(chan int, 10)

其中的第一個參數(shù)表示的是 通道的類型,而第二個參數(shù)則表示該 通道的長度。與字典類型相同,第二個參數(shù)也可以被忽略掉。不過忽略它的含義卻與針對字典類型的情況有著很大的不同,這些我們會在后面的博文中專門講解。

注意: make 函數(shù)只能被應(yīng)用在引用類型的值的創(chuàng)建上。并且,它的結(jié)果是第一個參數(shù)所代表的類型的值,而不是指向這個值的指針值。

如果我們想要獲得該指針值的話,只能在調(diào)用 make 函數(shù)的表達(dá)式的求值結(jié)果之上應(yīng)用取址操作符 &,像這樣:

m := make(map[string]int, 100)
mp := &m

到目前為止,我們已經(jīng)介紹了 3 種創(chuàng)建值的的方法:

  • 使用 字面量
  • 調(diào)用內(nèi)建函數(shù) new
  • 調(diào)用內(nèi)建函數(shù) make

它們適用于不同的應(yīng)用場景。當(dāng)然,在某些應(yīng)用場景中、我們可以有多種選擇:

  • 在創(chuàng)建一個切片類型的值的時候,我們既可以使用字面量也可以使用 make 函數(shù)。這種選擇的結(jié)果往往取決于我們是否需要定制切片值中的某個或某些元素值。
  • 如果我們能夠保證一個結(jié)構(gòu)體類型的值在其中字段的值均為零值的情況下就能夠處于可用狀態(tài)的話,那么僅使用 new 函數(shù)來初始化它與使用字面量進(jìn)行初始化是基本等價的。不過要注意,這兩種方法產(chǎn)生的結(jié)果的類型是不同的。

總結(jié)

通過本文的介紹,相信已經(jīng)了解了在Go語言中進(jìn)行變量初始化的基本方法和注意事項。

無論是使用var關(guān)鍵字聲明和初始化變量,還是通過短變量聲明方式,都可以輕松地初始化變量并開始編寫Go程序。

在編寫代碼時,始終確保正確地初始化變量是非常重要的,這有助于代碼的清晰度和可維護(hù)性。

到此這篇關(guān)于Go語言變量初始化的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go語言變量初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GoLang中panic和recover作用詳解

    GoLang中panic和recover作用詳解

    panic?和?recover?是?Go?語言中用于處理異常和錯誤的機制,能夠幫助我們應(yīng)對意外情況并使程序更加健壯,這篇文章主要介紹了GoLang中panic和recover作用詳解,需要的朋友可以參考下
    2024-05-05
  • golang 如何實現(xiàn)HTTP代理和反向代理

    golang 如何實現(xiàn)HTTP代理和反向代理

    這篇文章主要介紹了golang 實現(xiàn)HTTP代理和反向代理的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go 函數(shù)返回nil遇到問題避坑分析

    Go 函數(shù)返回nil遇到問題避坑分析

    這篇文章主要為大家介紹了Go 函數(shù)返回nil遇到的避坑問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • grpc入門Unary模式使用方法示例教程

    grpc入門Unary模式使用方法示例教程

    這篇文章主要為大家介紹了grpc入門Unary模式使用方法示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang學(xué)習(xí)筆記(四):array、slice、map

    Golang學(xué)習(xí)筆記(四):array、slice、map

    這篇文章主要介紹了Golang學(xué)習(xí)筆記(四):array、slice、map,本文分別講解了這3個類型的聲明&賦值、元素訪問、其它操作,需要的朋友可以參考下
    2015-05-05
  • go語言中的interface使用實例

    go語言中的interface使用實例

    這篇文章主要介紹了go語言中的interface使用實例,go語言中的interface是一組未實現(xiàn)的方法的集合,如果某個對象實現(xiàn)了接口中的所有方法,那么此對象就實現(xiàn)了此接口,需要的朋友可以參考下
    2015-05-05
  • golang1.21泛型函數(shù)全面講解

    golang1.21泛型函數(shù)全面講解

    在Go編程語言中,泛型一直是一個備受期待的特性,隨著Go?1.21的發(fā)布,本文旨在提供Go?1.21中泛型的詳細(xì)探索,闡明它們的優(yōu)點、語法、實現(xiàn)和最佳實踐,希望對大家有所幫助
    2023-09-09
  • 7分鐘讀懂Go的臨時對象池pool以及其應(yīng)用場景

    7分鐘讀懂Go的臨時對象池pool以及其應(yīng)用場景

    這篇文章主要給大家介紹了關(guān)于如何通過7分鐘讀懂Go的臨時對象池pool以及其應(yīng)用場景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用Go具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2018-11-11
  • Go語言Http?Server框架實現(xiàn)一個簡單的httpServer

    Go語言Http?Server框架實現(xiàn)一個簡單的httpServer

    這篇文章主要為大家介紹了Go語言Http?Server框架實現(xiàn)一個簡單的httpServer抽象,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go排序算法通用qsort函數(shù)使用示例

    Go排序算法通用qsort函數(shù)使用示例

    這篇文章主要為大家介紹了Go排序算法通用qsort函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評論