千家信息网

go语言结构体指针操作的方法

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容介绍了"go语言结构体指针操作的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!指针指针是
千家信息网最后更新 2026年10月31日go语言结构体指针操作的方法

本篇内容介绍了"go语言结构体指针操作的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

指针

指针是代表某个内存地址的值。内存地址储存另一个变量的值。

指针(地址),一旦定义了不可改变,指针指向的值可以改变

go指针操作

1.默认值nil,没有NULL常量

2.操作符"&"取变量地址,"*"通过指针(地址)访问目标对象(指向值)

3.不支持指针运算,不支持"->"(箭头)运算符,直接用"."访问目标成员

例子1:

package main //必须有个main包import "fmt"func main() {        var a int = 10        //每个变量有2层含义:变量的内存,变量的地址        fmt.Printf("a = %d\n", a) //变量的内存        fmt.Printf("&a = %d\n", &a)        //保存某个变量的地址,需要指针类型   *int 保存int的地址, **int 保存 *int 地址        //声明(定义), 定义只是特殊的声明        //定义一个变量p, 类型为*int        var p *int        p = &a //指针变量指向谁,就把谁的地址赋值给指针变量        fmt.Printf("p = %v, &a = %v\n", p, &a)        *p = 666 //*p操作的不是p的内存,是p所指向的内存(就是a)        fmt.Printf("*p = %v, a = %v\n", *p, a)}

例子2:

package mainimport "fmt"func main() {        a := 10        b := &a        *b = 11111  //操作指向a的值        fmt.Println(a)  //11111}

不能操作不合法指向

package main //必须有个main包import "fmt"func main() {        var p *int        p = nil        fmt.Println("p = ", p)        //*p = 666 //err, 因为p没有合法指向        var a int        p = &a //p指向a        *p = 666        fmt.Println("a = ", a)}

new函数

表达式new(int)将创建一个int类型的匿名变量,为int类型的新值分配并清零一块内存空间,然后将这块内存空间的地址作为结果返回,而这个结果就是指向这个新的int类型值的指针值,返回的指针类型为*int

package mainimport "fmt"func main() {        //var a *int        a := new(int)  // a为*int类型,指向匿名的int变量        fmt.Println(*a)  // 0        b := new(int)  // b为*int类型,指向匿名的int变量        *b = 2        fmt.Println(*b) // 2}

我们只需要使用new()函数,无需担心内存的生命周期,和回收删除。因为GO语言的(gc)内存管理系统会帮我们处理。

指针做函数的参数

例子1:交换值,普通变量做函数参数。内部交换成功,外部失败

package main //必须有个main包import "fmt"func swap(a, b int) {        a, b = b, a        fmt.Printf("swap: a = %d, b = %d\n", a, b)  //swap: a = 20, b = 10}func main() {        a, b := 10, 20        //通过一个函数交换a和b的内容        swap(a, b) //变量本身传递,值传递(站在变量角度)        fmt.Printf("main: a = %d, b = %d\n", a, b)  //main: a = 10, b = 20}

例子2:指针传参,内部外部都交换成功

package main //必须有个main包import (        "fmt")func test(a, b *int) {        *a, *b = *b, *a        fmt.Printf("swap: a = %d, b = %d\n", *a, *b)}func main() {        a, b := 10, 20        ////通过一个函数交换a和b的内容        test(&a, &b)        fmt.Printf("main: a = %d, b = %d\n", a, b)}

数组指针

//(*p)[0] = 666 数组指针赋值

package main //必须有个main包import "fmt"//p指向实现数组a,它是指向数组,它是数组指针//*p代表指针所指向的内存,就是实参afunc modify(p *[5]int) {        (*p)[0] = 666        fmt.Println("modify *a = ", *p)  //modify *a =  [666 2 3 4 5]}func main() {        a := [5]int{1, 2, 3, 4, 5} //初始化        modify(&a) //地址传递        fmt.Println("main: a = ", a)  // modify *a =  [666 2 3 4 5]}

结构体指针变量

package main //必须有个main包import "fmt"//定义一个结构体类型type Student struct {        id   int        name string        sex  byte //字符类型        age  int        addr string}func main() {        //顺序初始化,每个成员必须初始化, 别忘了&        var p1 *Student = &Student{1, "mike", 'm', 18, "bj"}        fmt.Println("p1 = ", p1)  //p1 =  &{1 mike 109 18 bj}        //指定成员初始化,没有初始化的成员,自动赋值为0        p2 := &Student{name: "mike", addr: "bj"}        fmt.Printf("p2 type is %T\n", p2) //p2 type is *main.Student        fmt.Println("p2 = ", p2)  //p2 =  &{0 mike 0 0 bj}}

结构体成员普通变量

//定义一个结构体类型type Student struct {        id   int        name string        sex  byte //字符类型        age  int        addr string}func main() {        //定义一个结构体普通变量        var s Student        //操作成员,需要使用点(.)运算符        s.id = 1        s.name = "mike"        s.sex = 'm' //字符        s.age = 18        s.addr = "bj"        fmt.Println("s = ", s) //s =  {1 mike 109 18 bj}}

结构体成员指针变量

func main() {        //1、指针有合法指向后,才操作成员        //先定义一个普通结构体变量        var s Student        //在定义一个指针变量,保存s的地址        var p1 *Student        p1 = &s        //通过指针操作成员  p1.id 和(*p1).id完全等价,只能使用.运算符        p1.id = 1        (*p1).name = "mike"        p1.sex = 'm'        p1.age = 18        p1.addr = "bj"        fmt.Println("p1 = ", p1)        //2、通过new申请一个结构体        p2 := new(Student)        p2.id = 1        p2.name = "mike"        p2.sex = 'm'        p2.age = 18        p2.addr = "bj"        fmt.Println("p2 = ", p2)}

结构体比较和赋值

func main() {        s1 := Student{1, "mike", 'm', 18, "bj"}        s2 := Student{1, "mike", 'm', 18, "bj"}        s3 := Student{2, "mike", 'm', 18, "bj"}        fmt.Println("s1 == s2 ", s1 == s2)        fmt.Println("s1 == s3 ", s1 == s3)        //同类型的2个结构体变量可以相互赋值        var tmp Student        tmp = s3        fmt.Println("tmp = ", tmp)}

结构体作为函数参数

func test02(p *Student) {        p.id = 666}func main() {        s := Student{1, "mike", 'm', 18, "bj"}        test02(&s) //地址传递(引用传递),形参可以改实参        fmt.Println("main: ", s)}func test01(s Student) {        s.id = 666        fmt.Println("test01: ", s)}func main01() {        s := Student{1, "mike", 'm', 18, "bj"}        test01(s) //值传递,形参无法改实参        fmt.Println("main: ", s)}

"go语言结构体指针操作的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

指针 变量 指向 地址 结构 类型 内存 成员 函数 数组 普通 例子 内容 运算 语言 参数 字符 就是 运算符 方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海喔噻互联网科技有限公司 科技和互联网公司 互联网属科技 合肥互联网科技公司 中国 科技 互联网 睿民互联网科技 友谊互联网络科技 金融科技和互联网金融 青岛中康互联网医疗科技有限公司 昭通互联网科技选哪家 中国航天科技大学国际工业互联网 电子科技大学互联网创业大赛 杭州披云加互联网科技有限公司 互联网风格科技公司名称 云鲸互联网络科技有限公司 兰石爱特工业互联网科技分公司 广西泛欧互联网科技有限公司 杭州融税互联网科技有限公司 恒生科技互联网指数十大成分股 互联网科技快速发展优美句子 互联网最新的科技有限公司 新浪科技互联网 互联网科技公司名称 威龙国际互联网科技公司 众安科技工业互联网合作 广东工业互联网大赛深圳学泰科技 互联网相关科技技术 绵阳真晨互联网科技有限公司 华人运通互联网科技公司 中国主要互联网科技公司
0