在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