在 Go 语言中,指针是一种存储变量内存地址的特殊类型。与一些其他编程语言不同,Go 语言中的指针不能进行运算,而是设计成了较为安全的指针。以下是关于 Go 语言中指针的基本用法和一些案例:
package main
import "fmt"
func main() {
var x int = 42
var p *int // 定义一个 int 类型的指针变量
p = &x // 将 x 的地址赋值给指针变量 p
fmt.Println("Value of x:", x)
fmt.Println("Address of x:", &x)
fmt.Println("Value stored in p:", *p) // 通过指针访问 x 的值
}
package main
import "fmt"
func main() {
p := new(int) // 使用 new 函数创建一个 int 类型的指针
*p = 42 // 通过指针设置值
fmt.Println("Value stored in p:", *p)
}
package main
import "fmt"
func double(x *int) {
*x *= 2
}
func main() {
value := 10
double(&value)
fmt.Println("Doubled value:", value)
}
package main
import "fmt"
func newInt() *int {
return new(int)
}
func main() {
p := newInt()
*p = 42
fmt.Println("Value stored in p:", *p)
}
package main
import "fmt"
func main() {
array := [3]int{1, 2, 3}
var pArray *[3]int = &array
slice := []int{4, 5, 6}
var pSlice *[]int = &slice
fmt.Println("Array:", array)
fmt.Println("Pointer to Array:", *pArray)
fmt.Println("Slice:", slice)
fmt.Println("Pointer to Slice:", *pSlice)
}
package main
import "fmt"
func main() {
var p *int // 未初始化的指针,默认值为 nil
if p == nil {
fmt.Println("Pointer is nil")
} else {
fmt.Println("Pointer is not nil")
}
}
这些例子展示了 Go 语言中指针的基本用法,包括指针的定义、指针作为函数参数和返回值、指针数组和指针切片等。指针在 Go 语言中广泛用于传递和操作内存地址,同时也帮助减少了一些可能的数据拷贝。
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
person := Person{"Alice", 25}
var pPerson *Person = &person
fmt.Println("Person:", person)
fmt.Println("Pointer to Person:", *pPerson)
// 修改结构体成员值
pPerson.Age = 26
fmt.Println("Modified Person:", person)
}
package main
import "fmt"
func modifySlice(s *[]int) {
(*s)[0] = 99
*s = append(*s, 100)
}
func main() {
slice := []int{1, 2, 3}
fmt.Println("Original Slice:", slice)
modifySlice(&slice)
fmt.Println("Modified Slice:", slice)
}
package main
import "fmt"
type Rectangle struct {
Width int
Height int
}
func (r *Rectangle) area() int {
return r.Width * r.Height
}
func main() {
rect := Rectangle{Width: 5, Height: 10}
fmt.Println("Area:", rect.area())
}
package main
import "fmt"
type Shape interface {
area() float64
}
type Circle struct {
Radius float64
}
func (c *Circle) area() float64 {
return 3.14 * c.Radius * c.Radius
}
func printArea(s Shape) {
fmt.Println("Area:", s.area())
}
func main() {
circle := Circle{Radius: 5}
printArea(&circle)
}
这些案例涵盖了指针在更复杂场景中的应用,包括结构体指针、指针和切片、指针和方法、接口中的指针等。这些例子展示了在实际应用中如何使用指针来处理更复杂的数据结构和场景。