一、值類型
定義:變量直接指向存在內存中的值,我們稱之為值類型。
值類型的變量的值存儲在棧中。
值類型 將一個變量賦值給另一個變量 被稱為值拷貝
package main
import "fmt"
func main(){
var num1,num2 int
num1 = 10
num2 = num1 // 值類型賦值操作
fmt.Println(num1,num2) // 10 10
num1 = 20
fmt.Println(num1,num2) // 20 10
}
二、指針類型
一個變量指向內存中值所在的內存地址,我們稱這個變量為指針類型
go 語言中的指針與C/C++ 中的指針用法是一樣的,只是出於安全性的考慮go增加了:
1、不同類型的指針不能互相轉化
2、任何普通指針類型*T和uintptr之間不能互相轉化
3、指針變量不能進行運算
package main
import "fmt"
func main(){
var num int = 100
var ptr *int // 類型前 加 * 表示這是指針類型,指針類型的初始值為nil ,和其他語言的NUll,None一樣
ptr = &num // & 取num 變量的內存地址。 因為ptr 是指針,指向的是內存地址,所以需要賦值操作的是內存地址
fmt.Println("ptr 指針的值:",ptr)
fmt.Println("*ptr 指針的值:",*ptr) // * 取指針內存地址所指向的值
num = 200
fmt.Println("*ptr 指針的值:",*ptr)
}
結果:
ptr 指針的值: 0xc000048080
*ptr 指針的值: 100
*ptr 指針的值: 200
ptr 是指針類型,並被賦予了 num 的內存地址,當num值發現變化時,實際也就是 ptr 內存地址所對應的值變了
因為 ptr內存地址所對應的 內存值就是num的值
三、值與內存地址與指針
1、變量是抽象出來的概念,go語言程序運行時即表示內存值
2、內存地址即 內存值所在的內存空間的編號
3、指針變量:是一種占位符,用於引用計算機的內存地址。可理解為內存地址的標簽
四、取地址與解引用
在go語言中我們可以通過
& 是取地址符號 , 即取得某個變量的地址 , 如 ; &a
* 是指針運算符 , 可以表示一個變量是指針類型 , 也可以表示一個指針變量所指向的存儲單元 , 也就是這個地址所存儲的值
package main
import "fmt"
func main(){
var n1,n2,n3 int
n1 = 100
n2 = 200
n3 = 3
swap(&n1,&n2) // 傳內存地址
add(&n3) // 取內存地址
fmt.Println(n1) // 200
fmt.Println(n2) // 100
fmt.Println(n3) // 4
var num *int // 申明一個int 指針類型
num = &n3 // 所以可以賦值 內存地址
add(num)
fmt.Println("num指針變量的內存值:",*num) // *num == 5
// 此時n3 == 5
}
// 傳入 兩個指針類型的數據.
func swap(i,j *int){
*i,*j = *j,*i // 值的替換
}
func add(num *int){
// *num 解引用
*num = *num + 1
}
五、引用類型
golang 沒有引用類型。。。。。