加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_新乡站长网 (https://www.0373zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

详解Go语言中指针的11个知识点

发布时间:2022-11-21 12:35:47 所属栏目:PHP教程 来源:
导读:  指针是写出优秀代码最重要的部分之一。在这篇文章中,我们将探索指针是什么,以及如何在 Go 中使用它们。

  1. 什么是指针

  指针是存储其指向地址的变量(强调一下,只是存储数值的变量)。【相关推
  指针是写出优秀代码最重要的部分之一。在这篇文章中,我们将探索指针是什么,以及如何在 Go 中使用它们。
 
  1. 什么是指针
 
  指针是存储其指向地址的变量(强调一下,只是存储数值的变量)。【相关推荐:Go视频教程】
 
  特定类型的指针只能指向该类型(指针指向的数据类型不可变)。
 
  2. GoLang 指针语法
 
  指针的语法非常简单。以下是 Go 中指针声明的语法。
 
  var ptr *type
  var ptrint *int     // 指向 int 的指针
  登录后复制
 
  指针的零值是 nil。
 
  3. Go 中指针的初始化
 
  类型的指针使用 & 对其进行初始化:
 
  package main
  import (
      "fmt"
  )
  func main() {
      var q int = 42
      var p *int     // declare the pointer
      p = &q         // initialize the pointer
      fmt.Println(p)  // 0x40e020
  }
  登录后复制
 
  4. Go 指针取值
 
  指针取值意味着获取指针保存的地址内的值。下面是使用 * 运算符执行指针取值操作的示例:
 
  package main
  import (
      "fmt"
  )
  func main() {
      var q int = 42
      var p *int
      p = &q
      fmt.Println(p)  // 0x40e020
      fmt.Println(*p) // 42
  }
  登录后复制
 
  5. GoLang 中指针的指针
 
  指针的地址为一个数值,此数值也可以被赋值给其他变量。因此,我们可以创建间接级别。这些间接级别有时会产生不必要的混淆,所以请谨慎使用。
 
  package main
  import (
      "fmt"
  )
  func main() {   
      i := 64
      j := &i  // j 是 int 类型的指针
      k := &j  // k 是存放指针地址的指针,也是 int 类型
      fmt.Println(i)  // 64
      fmt.Println(j)  // 0x40e020
      fmt.Println(*j) // 64 (value inside that address)
      fmt.Println(k)  // 0x40c138
      fmt.Println(*k) // 0x40e020 (address of j)
  }
  登录后复制
 
  6. 指向接口的指针
 
  指针可以指向任何东西,甚至可以指向接口。当使用空接口时,返回的值为 nil。
 
  package main
  import (
      "fmt"
  )
  func main() {   
      var a interface{}
      b := &a
      fmt.Println(b)    // 0x40c138
      fmt.Println(*b)   //
  }
  登录后复制
 
  下面是一个使用带有指针接口的例子。
 
  package main
  import (
      "fmt"
  )
  // 定义接口
  type Bird interface{
      fly()
  }
  type B struct{
      name string
  }
  // 实现它
  func (b B)fly() {
      fmt.Println("Flying...")
  }
  func main() {   
      var a Bird = B{"Peacock"}
      b := &a
      fmt.Println(b)    // 0x40c138
      fmt.Println(*b)   // {Peacock}
  }
  登录后复制
 
  这里 “a” 是一个 struct 类型的 Bird,然后用于接口类型php指针,如您所见。这就是多态的使用。Go 允许使用 接口来实现多态. 因此,您可以看到指向结构或接口的指针是 Go 中必不可少的工具。
 
  7. 指针作为函数参数
 
  指针可以在 函数 中作为参数使用。与直接使用值相比,它有一些优势。使用指针作为参数是将大对象传递给函数的一种非常有效的方式。因此,使用它是一个巨大的优化。
 
  package main
  import (
      "fmt"
  )
  //声明指针参数
  func f(a *int) {
      fmt.Println(*a)
  }
  func main() {   
      var a int = 42
      // 传递地址
      f(&a) // 42
  }
  登录后复制
 
  使用大型对象可以减缓执行时间,这是将指针传递给结构体的示例。这是处理大对象的有效方法。
 
  package main
  import (
      "fmt"
  )
  type Human struct {
      name string
      age int
      place string
  }
  func f(h *Human) {
      fmt.Println("The user", (*h).name, "is", (*h).age, "years old and he is from", (*h).place)
  }
  func main() {   
      john := Human{"John", 36, "Las Vegas"}
      f(&john) // The user John is 36 years old and he is from Las Vegas
  }
  登录后复制
 
  取消引用结构时要小心。如果您使用它像 *structname.field1 那么它会抛出错误。 正确的方法是 (*structname).field1。
 
  在函数内部使用指针会使值「可变」,除非它的参数为 const,因此,每当我们想要更改一个值时,我们应该使用指向该值的指针作为函数参数,然后进行必要的修改。
 
  8. Go 中的「new」函数
 
  Go 中的 new 函数返回一个指向类型的指针。
 
  package main
  import (
      "fmt"
  )
  func main() {   
      ptri := new(int)
      *ptri = 67
      fmt.Println(ptri)  // 0x40e020
      fmt.Println(*ptri) // 67
  }
  登录后复制
 
  9. 从函数返回指针
 
  可以像其他值一样从函数返回任何类型的指针。这真的很简单。我们不直接返回值,而是返回该值的地址。
 
  package main
  import (
      "fmt"
  )
  func p() *int {  // 将返回类型指定为指针
      v := 101
      // 返回地址
      return &v
  }
  func main() {   
      n := p()
      fmt.Println(n)  // 0x40e020
      fmt.Println(*n) // 101
  }
  登录后复制
 
  10. 指向函数的指针
 
  指向函数的指针在 Go 中是隐式工作的。这意味着我们不需要将其声明为指针。
 
  package main
  import (
      "fmt"
  )
  func main() {       
      f := func() {
          fmt.Println("a function")   
      }
      pf := f
      pf() // 一个函数
  }
  登录后复制
 
  11. Go 中使用指针要记住的事项
 
  Go 中不允许进行指针运算。因此,我们不能像在 C/C++ 中那样执行一元递增或递减之类的操作。
 
  我们可能希望使用指向数组的指针,但是使用切片是一个更好的选择。切片比指向数组的指针用途广泛得多。代码非常简洁,让我们的工作更加容易。因此,尽可能使用切片。
 

(编辑:开发网_新乡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!