在Go語言中,*號在類型聲明中表示指針類型。它與作為取值操作符的*有所不同,在類型聲明中,*表示聲明的變量是一個指針,指向某個特定數據類型的內存地址。
讓我們通過一個例子來理解:
package main import "fmt" type Employee struct { Id string Name string Age int } func main() { // 直接創建 Employee 類型的變量 e := Employee{"0", "P1", 33} fmt.Printf("e: %Tn", e) // 輸出: e: main.Employee // 使用 new() 函數創建 Employee 指針類型的變量 eNewed := new(Employee) // new() 返回的是一個指針 eNewed.Id = "1" fmt.Printf("eNewed: %Tn", eNewed) // 輸出: eNewed: *main.Employee // *int 表示指向 int 類型變量的指針 var intPtr *int var i int = 10 intPtr = &i // & 獲取變量的內存地址 fmt.Printf("intPtr: %T, *intPtr: %vn", intPtr, *intPtr) // 輸出: intPtr: *int, *intPtr: 10 //*[]int 表示指向 []int (整型切片) 的指針 var slicePtr *[]int var intSlice []int = []int{1,2,3} slicePtr = &intSlice fmt.Printf("slicePtr: %T, *slicePtr: %vn", slicePtr, *slicePtr) // 輸出: slicePtr: *[]int, *slicePtr: [1 2 3] }
在這個例子中:
立即學習“go語言免費學習筆記(深入)”;
- e 是一個 Employee 類型的變量,它直接存儲了 Employee 結構體的數據。
- eNewed 是一個 *Employee 類型的變量,它是一個指針,存儲的是 Employee 結構體數據的內存地址。 new(Employee) 分配了一塊內存用于存儲 Employee 結構體,并返回指向這塊內存的指針。
- *int 定義了一個指向整數的指針。&i 獲取整數變量 i 的內存地址,并將其賦值給 intPtr。 *intPtr 則訪問 intPtr 指向的內存地址中的值。
- *[]int 定義了一個指向整型切片的指針,類似的,*slicePtr 訪問 slicePtr 指向的內存地址中的切片數據。
因此,* 在類型聲明中表示指針類型,它不是取值操作符,而是類型定義的一部分,指示該變量存儲的是內存地址而不是實際數據。 通過指針,我們可以間接操作內存中的數據,實現高效的內存管理和數據共享。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END