go之值類型與引用類型使用及說明
1 概述
Go語言的數(shù)據(jù)類型有 值類型 與 引用類型 兩種。
- 值類型:在初始化、賦值時,兩個變量互不影響;參數(shù)傳遞時,傳遞的是一個副本
- 引用類型:在初始化、賦值時,兩個變量實際是同一個;參數(shù)傳遞時,傳遞的是變量本身。
在Go語言中,只有slice、map、interface、channel是引用類型,其他的都是值類型。
2案例
2.1 值類型
數(shù)組array類型是值類型,那么在使用相同的類型的變量初始化另一個變量時,兩個變量互不影響,如下array1與array2是兩個不同的數(shù)組:
array1 := [10]int64{}
array2 := array1
在賦值時,只是把array1的內(nèi)容拷貝到array2中,array1的修改不會再影響array2
package main
import (
"fmt"
)
func main() {
array1 := [10]int64{1,2}
array2 := [10]int64{}
array2 = array1
array1[0] = 100 // array2[0] 不會變
fmt.Printf("array1:%v\n",array1)
fmt.Printf("array2:%v\n",array2)
}運行結(jié)果:
array1:[100 2 0 0 0 0 0 0 0 0] array2:[1 2 0 0 0 0 0 0 0 0]
2.2 引用類型
切片是引用類型,所以當(dāng)使用一個切片初始化另一個切片時,兩個切片實際是同一個。
package main
import (
"fmt"
)
func main() {
slice1 := make([]int64, 1, 10) // 初始化一個len為1,cap為10的切片
slice2 := slice1
slice1[0] = 1 // slice2[0] 也會變成1
fmt.Printf("slice1:%v\n",slice1)
fmt.Printf("slice2:%v\n",slice2)
}運行結(jié)果:
slice1:[1] slice2:[1]
3 golang中的struct類型
Golang中沒有class關(guān)鍵字來定義類,對于事物的抽象以struct來定義,因此一個struct變量可以被看做一個類實例。
但是這有別于java,因為struct在方法中傳參時是值類型而非引用類型,所以當(dāng)需要在方法內(nèi)改變這個對象的字段值時,應(yīng)該使用的是struct變量的指針,而非struct變量。
type Student struct{
Name string
}
func (s * Student) Set(name string){
s.Name = name
}
func (s Student) Get()string{
return s.Name
}由上可知:
如果方法內(nèi)部會修改當(dāng)前對象的字段或改變其值,需要用指針。
由于值傳遞是(內(nèi)存)復(fù)制,因此,如果對象比較大,應(yīng)該使用指針(地址),避免內(nèi)存拷貝(值類型等變量指向內(nèi)存中的值,如果有值類型變量存放大量元素,或造成內(nèi)存的大量拷貝)。
注意:不見得使用指針就一定好過傳值,因為按照 Go 的內(nèi)存管理策略,涉及指針和引用的對象會被分配到 GC Heap 上。如果對象很 “小”,顯然要比在棧上進行值拷貝 “耗費” 更多。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Go多協(xié)程并發(fā)環(huán)境下的錯誤處理
這篇文章主要介紹了詳解Go多協(xié)程并發(fā)環(huán)境下的錯誤處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Golang 如何判斷數(shù)組某個元素是否存在 (isset)
這篇文章主要介紹了Golang 如何判斷數(shù)組某個元素是否存在 (isset),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

