学习一次:golang指针很强大
#go #指针

指针是GO中的一个基本概念,它使您可以将参考文献传递给程序中的值和记录。它们是该语言的关键特征,可用于改善代码的性能并启用更强大的抽象。

在GO中,指针是一个存储另一个变量的内存地址的变量。您可以通过使用&运算符获取变量的地址来创建指针。例如:

package main

import "fmt"

func main() {
    x := 10
    var p *int = &x

    fmt.Println(p) // prints the memory address of x
    fmt.Println(*p) // prints the value of x
}

在此示例中,我们创建一个具有值10的变量X,将指针p分为x。 &运算符返回X的内存地址,该地址存储在p。

您可以使用 *运算符来放置指针并访问其指向的值。在上面的示例中, *p返回x的值,即10。

指示器可用于传递对函数之间值的引用。例如。

package main

import "fmt"

func addOne(x *int) {
    *x = *x + 1
}

func main() {
    x := 10
    addOne(&x)
    fmt.Println(x) // prints 11
}

在此示例中,我们将X的内存地址传递给Addone函数作为指针。在函数内部,我们使用 *操作员放置指针并修改x的值。当我们在主函数中打印x时,它已被一个。

递增。

让我们看一下如何使用指针做一些进步的事情

  1. 方法中的指针接收器:在GO中,您可以在任何类型上定义方法,包括指针。当您用指针接收器定义方法时,这意味着该方法可以修改接收器的值。例如:
package main

import "fmt"

type MyStruct struct {
    x int
}

func (s *MyStruct) increment() {
    s.x++
}

func main() {
    s := MyStruct{x: 10}
    s.increment()
    fmt.Println(s.x) // prints 11
}

在此示例中,我们用指针接收器定义了mystruct上的方法。当我们在mystruct的实例上调用该方法时,它会增加x的值。如果我们使用值接收器(例如func(s mystruct)regrement())定义了该方法,则它将无法修改s。

的值
  1. 指针类型:在GO中,您可以定义一种新类型,该类型是指向另一种类型的指针。例如:
package main

import "fmt"

type MyInt int
type MyIntPointer *MyInt

func main() {
    var x MyInt = 10
    var p MyIntPointer = &x
    fmt.Println(*p) // prints 10
}

在此示例中,我们定义了一种新型MyIntPointer,它是指向MyInt的指针。然后,我们可以像其他任何指针类型一样使用MyIntPointer。

  1. 指示结构:您可以使用指针来结构构造,以避免将大结构作为函数参数传递时。例如:
package main

import "fmt"

type MyStruct struct {
    x int
    y int
}

func updateStruct(s *MyStruct) {
    s.x++
    s.y++
}

func main() {
    s := MyStruct{x: 10, y: 20}
    updateStruct(&s)
    fmt.Println(s) // prints {11 20}
}

在此示例中,我们将指针传递给s to UpdateStruct函数。这避免了复制整个结构,这对于大型结构可能更有效。

指针也可以用于在goroutines之间共享数据,这是执行的轻量级线程。通过将指针传递到Goroutine,您可以从多个Goroutines访问并修改相同的数据。

这是使用它的示例

package main

import (
    "fmt"
    "sync"
    "time"
)

type MyStruct struct {
    x int
    y int
}

func updateStruct(s *MyStruct, wg *sync.WaitGroup) {
    s.x++
    s.y++
    wg.Done()
}

func main() {
    s := MyStruct{x: 10, y: 20}
    var wg sync.WaitGroup

    wg.Add(2)
    go updateStruct(&s, &wg)
    go updateStruct(&s, &wg)
    wg.Wait()

    fmt.Println(s) // prints {12 22}
}

在此示例中,我们创建一个带有两个字段x和y的结构mystruct。然后,我们使用指向结构的指针创建两个goroutines,既可以递增x和y。我们使用Sync.WaitGroup来确保在打印s。

的最终值之前,两个goroutines都已经完成

请注意,我们将指针传递给S和同步。这使Goroutines可以访问和修改相同的数据。如果我们通过s和同步的值而不是指针,则goroutines将在数据的副本上使用,并且原始值不会被修改。

值得注意的是,Go具有一个垃圾收集器,该收集器在不再需要时会自动释放内存。这意味着您不必像在c。

总的来说,指针是GO的强大而重要的功能,使您能够编写高效和表现力的代码。我希望这篇文章能帮助您了解Pointer在GO中的工作方式。