Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go变量指针

Go变量指针的实现示例

作者:Jayden_念旧

Go指针存储变量地址,用于修改变量、避免拷贝、动态分配,本文就来详细的介绍一下Go变量指针的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在Go语言中,指针是一个存储变量内存地址的变量。通过指针,可以间接访问和操作原始数据。从而提高程序的效率,特别是在处理复杂数据结构或需要共享数据时。

概念说明
指针声明var p *int
取地址&a → 获取 a 的地址
解引用*p → 访问 p 指向的值
零值nil
主要用途修改变量、避免拷贝、动态分配

1.指针的本质

2.声明指针

语法:var ptr *Type

var a int = 10
var ptr *int // 声明一个指向 int 类型的指针
ptr = &a     // 将 a 的内存地址赋值给 ptr

3.关键操作符

ptr = &a // ptr 现在存储 a 的地址
  fmt.Println(*ptr) // 输出 10(通过 ptr 访问 a 的值)
  *ptr = 20         // 修改 a 的值为 20

4.指针的零值

var ptr *int // 初始值为 nil

5.指针的用途

  func modify(val *int) {
      *val = 100
  }
  func main() {
      x := 10
      modify(&x) // x 被修改为 100
  }
  type Data struct { /* 大结构体 */ }
  func process(d *Data) { /* 操作 d */ }
  p := new(int) // 分配内存,返回指针
  *p = 42

6.指针示例

package main
 
import (
	"fmt"
)
 
type Person struct {
	Name    string
	Age     int
	Address string
	Salary  float64
}
 
func NewPerson(name string, age int, address string, salary float64) *Person {
	return &Person{Name: name, Age: age, Address: address, Salary: salary}
}
 
func main() {
	// 创建Person实例
	p := NewPerson("张三", 30, "北京市海淀区", 15000.50)
 
	// 访问字段
	fmt.Println(p.Name)   // 输出:张三
	fmt.Println(p.Salary) // 输出:15000.5
 
	// 修改字段值
	p.Age = 31
	p.Salary = 16000.00
}

为什么使用创建结构体指针:

1.内存效率优化

// 值类型返回(产生完整结构体拷贝)
func NewPerson() Person {
    return Person{...}
}

// 指针类型返回(仅传递内存地址)
func NewPerson() *Person {
    return &Person{...}
}

2. 可变性控制

p := NewPerson("李四", 28, "上海", 25000)
p.Age = 29 // 直接修改原结构体

// 值类型接收者方法示例(无法修改原结构体)
func (p Person) SetAge(age int) {
    p.Age = age // 仅修改副本
}

// 指针类型接收者方法示例
func (p *Person) RealSetAge(age int) {
    p.Age = age // 修改原结构体
}

3. 零值有效性

// 错误处理扩展性
func NewPerson(age int) (*Person, error) {
    if age < 0 {
        return nil, errors.New("invalid age")
    }
    return &Person{Age: age}, nil
}

7.注意!!!!!!!

扩展:使用指针修改原始变量和通过函数修改的区别是什么

原理差异

代码实现差异

指针修改示例

package main
 
import (
    "fmt"
)
 
func modifyString(s *string) {
    bytes := []byte(*s)
    bytes = append(bytes, ' ', 'a', 'b', 'c')
    *s = string(bytes)
}
 
func main() {
    str := "this is a string"
    fmt.Println(&str)
    modifyString(&str)
    fmt.Println(str)
}

strings.Builder修改示例

package main
 
import (
	"fmt"
	"strings"
)
 
func main() {
	str := "this is a string"
	fmt.Println(&str)
	// 创建一个 strings.Builder 实例
	var builder strings.Builder
	// 将原始字符串写入 Builder
	builder.WriteString(str)
	// 在末尾添加 abc
	builder.WriteString(" abc")
	// 获取最终的字符串
	str = builder.String()
	fmt.Println(str)
}

性能差异

使用场景差异

到此这篇关于Go变量指针的实现示例的文章就介绍到这了,更多相关Go变量指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文