4/07/2025

Go语言无名指针类型及其作用

 在 Go 语言中,无名指针类型(Unnamed Pointer Type) 指的是直接通过指针语法(如 *int*string)声明的指针类型,而不是通过 type 关键字显式命名的类型(如 type IntPtr *int)。它的核心作用是简化代码,提供底层类型的灵活性,避免不必要的类型转换。


无名指针类型的作用

  1. 隐式类型兼容性
    无名指针类型直接基于底层类型,因此相同底层类型的指针可以直接赋值或传递,无需显式类型转换。

  2. 减少冗余代码
    无需通过 type 定义新类型,直接使用 *T 语法,简化代码结构。

  3. 与标准库或第三方库兼容
    许多库函数直接使用无名指针类型(如 *os.File),使用无名类型可以无缝对接。


示例说明

场景 1:直接操作底层类型

go
复制
func main() {
    a := 42
    var ptr1 *int = &a  // ptr1 是无名指针类型 *int
    fmt.Println(*ptr1)  // 输出 42

    // 直接传递无名指针
    modifyValue(ptr1)
    fmt.Println(*ptr1)  // 输出 100
}

func modifyValue(p *int) {
    *p = 100
}
  • ptr1 是 *int 类型的无名指针,可以直接传递给接受 *int 参数的函数 modifyValue


场景 2:与命名指针类型的区别

go
复制
type NamedPtr *int // 命名指针类型

func main() {
    x := 10
    var p1 *int = &x    // 无名指针类型
    var p2 NamedPtr = &x // 命名指针类型

    // p1 和 p2 的底层类型相同,但需要显式转换
    p1 = (*int)(p2) // 必须强制转换
    fmt.Println(*p1) // 输出 10
}
  • 无名指针类型 *int 可以直接操作,而命名类型 NamedPtr 需要显式转换后才能赋值给 *int


场景 3:结构体中的无名指针字段

go
复制
type Data struct {
    Value *int // 无名指针类型字段
}

func main() {
    v := 5
    d := Data{Value: &v}
    fmt.Println(*d.Value) // 输出 5
}
  • 结构体字段 Value 使用无名指针类型 *int,可以直接接受任何 *int 类型的指针。


场景 4:JSON 反序列化

go
复制
type User struct {
    Name  *string `json:"name"` // 无名指针类型
    Age   *int    `json:"age"`  // 无名指针类型
}

func main() {
    jsonStr := `{"name": "Alice", "age": 30}`
    var user User
    json.Unmarshal([]byte(jsonStr), &user)
    fmt.Println(*user.Name, *user.Age) // 输出 Alice 30
}
  • 使用无名指针类型 *string 和 *int,JSON 库可以直接将解析结果写入指针指向的地址。


无名指针类型的适用场景

  • 需要直接操作底层类型时(如函数参数传递)。

  • 需要与标准库或第三方库无缝交互时(如 *os.File)。

  • 不需要额外类型安全性检查的简单场景。

命名指针类型的适用场景

  • 需要明确区分语义时(如 type UserID *int)。

  • 需要增强类型安全性,避免误用底层类型时。

通过无名指针类型,Go 语言在类型系统中平衡了灵活性和简洁性。

Ubuntu linux修改dns服务器

在Ubuntu Linux系统中,修改DNS服务器分为临时和永久两种方式,具体方法如下: ---  一、临时修改DNS(重启后失效)  方法1:直接修改 `/etc/resolv.conf` bash sudo nano /etc/resolv.conf 删除原有 `namese...