• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

GO的 和amp; 和 * 在创建结构体对象场景的含义

武飞扬头像
t0mCl0nes
帮助1

在赋值场景中 & 和 *  分别是取地址和取值的两个特殊操作,是最基础的用法和语义。

当 * 出现在参数中或者声明场景时,代表传参类型需要指针类型或者声明一个指针变量。

基本类型的应用场景:

  1.  
    a := 1 // 声明变量a 并赋值1
  2.  
    var b *int // 声明int类型地址指针 变量b
  3.  
    b = &a // 将a变量地址赋值给 地址指针 b
  4.  
    c := *b // c取值*b,也就是 *&a 得到的就是 变量a的值 1 *&a = a, 相当于*&抵消了
  5.  
     
  6.  
    // 上述场景为通常的变量取地址和取值

struct结构体对象应用场景:

  1.  
    import (
  2.  
    "fmt"
  3.  
    )
  4.  
     
  5.  
    type Book struct { // 定义一个Book类型的结构体,有三个导出(public访问权限)属性
  6.  
    ID int64
  7.  
    Title string
  8.  
    Price float32
  9.  
    }
  10.  
     
  11.  
    // 定义两个函数,一个是传递Book值参数,一个是传递Book指针参数
  12.  
    // 作为值传递的参数Book,在方法体内使用参数b时,不会改变原对象
  13.  
    func changePrice1(b Book, p float32) {
  14.  
    b.Price = p
  15.  
    }
  16.  
     
  17.  
    // 作为指针传递的参数Book,在方法体内使用参数b时,会改变原对象
  18.  
    func changePrice2(b *Book, p float32) {
  19.  
    b.Price = p
  20.  
    }
  21.  
     
  22.  
     
  23.  
    func main() {
  24.  
    // 方式1创建并赋值, 此时创建b1是一个值对象,直接使用b1时作为值对象使用,如果作为指针需要使用&
  25.  
    b1 := Book{1, "go", 12.1}
  26.  
     
  27.  
    // 方式2创建并赋值,此时创建b2是一个指针对象,直接使用b2时作为指针使用,如果要获取对象值使用*
  28.  
    b2 := &Book{2, "java", 1.1}
  29.  
     
  30.  
    // changePrice1需要的Book参数为值对象所以此时当前main作用域内的b1和b2的字段值不会改变
  31.  
    changePrice1(b1, 10)
  32.  
    changePrice1(*b2, 10)
  33.  
     
  34.  
    // 打印的b1 b2的Price值为原值,并且可以注意到,打印的b1为{...}, b2为&{...}
  35.  
    fmt.Println(b1)
  36.  
    fmt.Println(b2)
  37.  
     
  38.  
    // changePrice2需要的Book参数为指针对象所以此时当前main作用域内的b1和b2的字段值会改变
  39.  
    changePrice2(&b1, 10)
  40.  
    changePrice2(b2, 10)
  41.  
     
  42.  
    // b1 b2的Price变为了10
  43.  
    fmt.Println(b1)
  44.  
    fmt.Println(b2)
  45.  
     
  46.  
    }
学新通

该场景下可以看出,创建对象时,直接创建type_name{}和&type_name{}的区别,如果需要当前对象在多数情况下作为指针使用并传递时使用&type_name{}方式创建对后续使用更方便,如果只作为dto类型的值使用时,直接type_name{}方式创建和使用更方便。

两种形式的创建对象都可以,具体使用哪种要参照业务场景,选择一个合适的即可。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfbccg
系列文章
更多 icon
同类精品
更多 icon
继续加载