golang中指针的基本用法

在 Go 语言中,指针是一种存储变量内存地址的特殊类型。与一些其他编程语言不同,Go 语言中的指针不能进行运算,而是设计成了较为安全的指针。以下是关于 Go 语言中指针的基本用法和一些案例:

1. 基本用法

1.1 定义指针
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 的值
}
1.2 使用 new 函数创建指针
package main

import "fmt"

func main() {
    p := new(int) // 使用 new 函数创建一个 int 类型的指针
    *p = 42       // 通过指针设置值

    fmt.Println("Value stored in p:", *p)
}

2. 指针作为函数参数

package main

import "fmt"

func double(x *int) {
    *x *= 2
}

func main() {
    value := 10
    double(&value)
    fmt.Println("Doubled value:", value)
}

3. 指针作为函数返回值

package main

import "fmt"

func newInt() *int {
    return new(int)
}

func main() {
    p := newInt()
    *p = 42
    fmt.Println("Value stored in p:", *p)
}

4. 指针数组和指针切片

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)
}

5. Nil 指针

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 语言中广泛用于传递和操作内存地址,同时也帮助减少了一些可能的数据拷贝。

6. 结构体指针

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)
}

7. 指针和切片

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)
}

8. 指针和方法

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())
}

9. 接口中的指针

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)
}

这些案例涵盖了指针在更复杂场景中的应用,包括结构体指针、指针和切片、指针和方法、接口中的指针等。这些例子展示了在实际应用中如何使用指针来处理更复杂的数据结构和场景。

你可能感兴趣的:(golang,xcode,开发语言)