👀 Golang 中的 `&`|`*`

0️⃣ Before

一两年前刚接触Golang的时候在B站看教学视频然后试着自己敲了一个小项目(也就是目前差不多弃疗的 Hexo Editor

然后一时间被 &* 整得十分迷糊 🤡

前段时间有说过要自己尝试去实现 反向代理 & 端口转发 ....

于是今天开始了,便顺带着和GPT唠了唠这部分

1️⃣ Begin

在 Golang 中,指针是一种特殊的数据类型,用于存储变量的内存地址。指针通过 * 运算符进行声明和操作。以下是一些关键的指针相关概念:

  • 声明指针:使用 * 运算符在变量名前面声明一个指针类型,并使用 & 运算符获取变量的地址。例如,var ptr *int 声明了一个指向 int 类型值的指针。
  • 解引用指针:对指针应用 * 运算符可以解引用指针,以获取指针所指向的实际值。例如,*ptr 表示获取指针 ptr 所指向的 int 类型的值。
  • 空指针:指针的零值是 nil,表示它不指向任何有效的内存地址。可以在声明时将指针初始化为 nil,或者在后续使用中将其赋值为 nil。
  • 传递指针给函数:通过在函数参数中使用指针类型,可以传递变量的地址给函数,使函数能够修改原始变量的值。在函数内部解引用指针,可以修改指针所指向的值。
  • 避免复制大量数据:传递指针而不是值类型给函数,可以避免对大型数据结构进行复制,提高性能和节省内存。
  • 结构体指针:可以使用指针来操作结构体类型的字段,通过指针可以直接修改结构体的字段值,而不需要进行复制。
  • 动态内存分配:通过使用 new 函数可以动态地为类型分配内存,并返回指向新分配的内存的指针。
type Struct struct {
    field1 string
}

func main() {
    data1 := Struct{
        field1: "2333",
    }
    test(&data1)

    data2 := &Struct{
        field1: "2333",
    }
    test(data2)
}

func test(data *Struct) {
    data.field1 = "1222"
}
  1. 对于 data1: 它是值类型的结构体实例,因此当你将其传递给 test 函数时,需要使用 & 运算符来获取其地址,即 test(&data1)。这样,test 函数接收的是 data1 的地址的指针,可以对原始实例进行修改。
  2. 对于 data2: 它已经是指针类型的结构体,即已经是一个存储着结构体实例地址的指针。因此,在调用 test 函数时,你可以直接将 data2 作为参数传递给 test,不需要再使用 & 运算符,即 test(data2)。这样,data2 作为指针传递给 test 函数,函数可以直接对指针所指向的结构体实例进行修改。
a example
func main() {
    str := "233"
    fmt.Println(str) // 233
    test(&str)
    fmt.Println(str) // 123
}

func test(str *string) {
    *str = "123"
}
消息盒子
# 您需要首次评论以获取消息 #
# 您需要首次评论以获取消息 #

只显示最新10条未读和已读信息