👀 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"
}
- 对于
data1: 它是值类型的结构体实例,因此当你将其传递给 test 函数时,需要使用 & 运算符来获取其地址,即 test(&data1)。这样,test 函数接收的是 data1 的地址的指针,可以对原始实例进行修改。 - 对于
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"
}




空空如也!