返回顶部
首页 > 资讯 > 精选 >Go struct实例化和赋值实例分析
  • 328
分享到

Go struct实例化和赋值实例分析

2023-06-25 16:06:47 328人浏览 泡泡鱼
摘要

这篇文章主要介绍“Go struct实例化和赋值实例分析”,在日常操作中,相信很多人在Go struct实例化和赋值实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go struct实例化和赋值实例分析

这篇文章主要介绍“Go struct实例化和赋值实例分析”,在日常操作中,相信很多人在Go struct实例化和赋值实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go struct实例化和赋值实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!                          

golang 中 struct 各种实例化和赋值方式,一会儿是值传递,一会儿又是指针,让人一头雾水,于是我决定梳理一下,整个明白。

先定义一个结构体,下面结合代码进行讲解。

package mainimport "fmt"type Person struct {    Name string    Age int    Descprtion string}

实例一

p 以最常规的方式实例化一个 struct,变量 p 得到一个 Person 结构体。

p := Person{}p.Name = "小明"fmt.Printf("p:%+v 变量地址:%p\n", p, &p)fmt.Println("===========")// result:// p:{Name:小明 Age:0 Descprtion:} 变量地址:0xc000078480// ===========

实例二

变量 p1 由 p 赋值而来,由于 Golang 语言是值传递,赋值后,对 p1 的修改并不会影响到 p;

从第一个输出也可以看得出,Golang 的赋值并不存在像PHP变量赋值时的写时复制(copy on write)机制。

Go struct实例化和赋值实例分析

p1 := pfmt.Printf("p1:%+v 变量地址:%p\n", p1, &p1) // 不存在写时复制p1.Name = "小明p1"fmt.Printf("p:%+v 变量地址:%p\n", p, &p)fmt.Printf("p1:%+v 变量地址:%p\n", p1, &p1)fmt.Println("===========")// result:// p1:{Name:小明 Age:0 Descprtion:} 变量地址:0xc0000784e0// p:{Name:小明 Age:0 Descprtion:} 变量地址:0xc000078480// p1:{Name:小明p1 Age:0 Descprtion:} 变量地址:0xc0000784e0// ===========

实例三

利用取地址符将 p 的地址赋值给 p2,变量 p2 是一个指针,存放着指向 p 的地址。当 p2 修改了结构体中元素 Name 时,通过 p 访问结构体对应的值也相应地发生了变化。

Go struct实例化和赋值实例分析

p2 := &p // 等同于 var p2 *Person = &pfmt.Printf("p2:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p2, p2, &p2)p2.Name = "小明p2"fmt.Printf("p1:%+v 变量地址:%p\n", p, &p)fmt.Printf("p2:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p2, p2, &p2)fmt.Println("===========")// result:// p2:&{Name:小明 Age:0 Descprtion:} 指针变量指向地址(变量值):0xc000078480 变量地址:0xc000006030// p1:{Name:小明p2 Age:0 Descprtion:} 变量地址:0xc000078480// p2:&{Name:小明p2 Age:0 Descprtion:} 指针变量指向地址(变量值):0xc000078480 变量地址:0xc000006030// ===========

实例四

变量 p3 由 new(Person) 得来。new 将开辟一块内存,返回内存地址给 p3,也即 p3 是一个指向这块内存的指针。

p3 是指向结构体的指针,它有两种方式可以操作结构体,p3.Age = 3*p3 = Person{Name: "小明p3"}, 如果第二种方式后操作,将会覆盖第一种方式对结构体的修改。

由于 p3 是指针,当 p3 赋值给 p5 时,p5 也将指向这块内存地址。

Go struct实例化和赋值实例分析

p3 := new(Person)fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)p3.Age = 3 // 等同于 (*p3).Age = 3fmt.Println("================ 操作 Age ================")fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)*p3 = Person{    Name: "小明p3",}fmt.Println("================ 操作 Name ================")fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)p5 := p3fmt.Println("================ p5 := p3 ================")fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)fmt.Printf("p5:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p5, p5, &p5)p3.Name = "小明p3修改"fmt.Println("================ p3 修改 ================")fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)fmt.Printf("p5:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p5, p5, &p5)fmt.Println("===========")// result:// p3:&{Name: Age:0 Descprtion:} 指针变量指向地址(变量值):0xc000078630 变量地址:0xc000006038// ================ 操作 Age ================// p3:&{Name: Age:3 Descprtion:} 指针变量指向地址(变量值):0xc000078630 变量地址:0xc000006038// ================ 操作 Name ================// p3:&{Name:小明p3 Age:0 Descprtion:} 指针变量指向地址(变量值):0xc000078630 变量地址:0xc000006038// ================ p5 := p3 ================// p5:&{Name:小明p3 Age:0 Descprtion:} 指针变量指向地址(变量值):0xc000078630 变量地址:0xc000006040// ================ p3 修改 ================// p3:&{Name:小明p3修改 Age:0 Descprtion:} 指针变量指向地址(变量值):0xc000078630 变量地址:0xc000006038// p5:&{Name:小明p3修改 Age:0 Descprtion:} 指针变量指向地址(变量值):0xc000078630 变量地址:0xc000006040// ===========

示例五

p4 的实例化方式也将得到一个指针,这种实例化方式与 p3 的实例化是相同的,但 p4 的写法更常使用。

Go struct实例化和赋值实例分析

p4 := &Person{    Name: "小明p4",}fmt.Printf("%+v %p\n", p4, &p4)// result:// &{Name:小明p4 Age:0 Descprtion:} 0xc000006048

附完整代码:

package mainimport "fmt"type Person struct {    Name string    Age int    Descprtion string}func main() {    p := Person{}    p.Name = "小明"    fmt.Printf("p:%+v 变量地址:%p\n", p, &p)    fmt.Println("===========")    p1 := p    fmt.Printf("p1:%+v 变量地址:%p\n", p1, &p1) // 不存在写时复制    p1.Name = "小明p1"    fmt.Printf("p:%+v 变量地址:%p\n", p, &p)    fmt.Printf("p1:%+v 变量地址:%p\n", p1, &p1)    fmt.Println("===========")    p2 := &p    fmt.Printf("p2:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p2, p2, &p2)    p2.Name = "小明p2"    fmt.Printf("p1:%+v 变量地址:%p\n", p, &p)    fmt.Printf("p2:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p2, p2, &p2)    fmt.Println("===========")    p3 := new(Person)    fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)    p3.Age = 3 // 等同于 (*p3).Age = 3    fmt.Println("================ 操作 Age ================")    fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)    *p3 = Person{        Name: "小明p3",    }    fmt.Println("================ 操作 Name ================")    fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)    p5 := p3    fmt.Println("================ p5 := p3 ================")    fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)    fmt.Printf("p5:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p5, p5, &p5)    p3.Name = "小明p3修改"    fmt.Println("================ p3 修改 ================")    fmt.Printf("p3:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p3, p3, &p3)    fmt.Printf("p5:%+v 指针变量指向地址(变量值):%p 变量地址:%p\n", p5, p5, &p5)    fmt.Println("===========")    p4 := &Person{        Name: "小明p4",    }    fmt.Printf("%+v %p\n", p4, &p4)}

到此,关于“Go struct实例化和赋值实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Go struct实例化和赋值实例分析

本文链接: https://lsjlt.com/news/305997.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go struct实例化和赋值实例分析
    这篇文章主要介绍“Go struct实例化和赋值实例分析”,在日常操作中,相信很多人在Go struct实例化和赋值实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go struct实例化和赋值实例分析...
    99+
    2023-06-25
  • JavaScript引用赋值与传值赋值实例分析
    这篇文章主要介绍“JavaScript引用赋值与传值赋值实例分析”,在日常操作中,相信很多人在JavaScript引用赋值与传值赋值实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript引...
    99+
    2023-06-30
  • python变量赋值机制实例分析
    这篇“python变量赋值机制实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python变量赋值机制实例分析”文章吧...
    99+
    2023-06-29
  • JavaScript对象和数组的解构赋值实例分析
    本文小编为大家详细介绍“JavaScript对象和数组的解构赋值实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript对象和数组的解构赋值实例分析”文章能帮助大家解决疑惑,下面跟着小编...
    99+
    2024-04-02
  • ES6变量赋值和基本数据类型实例分析
    本篇内容介绍了“ES6变量赋值和基本数据类型实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!let和constlet和const不存在...
    99+
    2023-07-02
  • Go语言接口赋值实例介绍
    本篇内容主要讲解“Go语言接口赋值实例介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言接口赋值实例介绍”吧!将对象实例赋值给接口先看看将指定类型的对象...
    99+
    2024-04-02
  • JavaScript解构赋值的示例分析
    这篇文章给大家分享的是有关JavaScript解构赋值的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概念ES6提供了更简洁的赋值模式,从数组和对象中提取值,这被称为解构...
    99+
    2024-04-02
  • Mysql中的NULL和空值实例分析
    本篇内容介绍了“Mysql中的NULL和空值实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!字段属性的”空值”与”NULL”不一样相信...
    99+
    2023-06-27
  • C++继承中的对象构造与析构和赋值重载实例分析
    本文小编为大家详细介绍“C++继承中的对象构造与析构和赋值重载实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++继承中的对象构造与析构和赋值重载实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一...
    99+
    2023-06-29
  • JavaScript数值number实例分析
    这篇文章主要介绍“JavaScript数值number实例分析”,在日常操作中,相信很多人在JavaScript数值number实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • vue之数组定义和赋值的示例分析
    小编给大家分享一下vue之数组定义和赋值的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问题场景:vue页面初始化展示请...
    99+
    2024-04-02
  • ES6的解构赋值的示例分析
    这篇文章主要介绍ES6的解构赋值的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1 什么是解构赋值解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性赋给各种变量。...
    99+
    2024-04-02
  • ajax动态赋值echarts的示例分析
    这篇文章主要介绍了ajax动态赋值echarts的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、饼形图赋值步骤(1)jsp页面&...
    99+
    2024-04-02
  • Go切片slice实例分析
    本文小编为大家详细介绍“Go切片slice实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go切片slice实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。slice表示切片(分片),例如对一个数组...
    99+
    2023-06-30
  • Go简单字符串插值特性实例分析
    这篇文章主要讲解了“Go简单字符串插值特性实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go简单字符串插值特性实例分析”吧!fmt.Printf 或 fmt.Sp...
    99+
    2023-07-05
  • CSS RGB颜色值实例分析
    本文小编为大家详细介绍“CSS RGB颜色值实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“CSS RGB颜色值实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2024-04-02
  • python数值运算实例分析
    今天小编给大家分享一下python数值运算实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。说明对整数型和浮点型来说,由...
    99+
    2023-06-30
  • GO的锁和原子操作实例分析
    本篇内容介绍了“GO的锁和原子操作实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!锁是什么锁 是用于解决隔离性的一种机制某个协程(线程...
    99+
    2023-07-05
  • Redis持久化实例分析
    本篇内容介绍了“Redis持久化实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!面试官:小伙子,谈谈...
    99+
    2024-04-02
  • PHP中null判断赋值的示例分析
    小编给大家分享一下PHP中null判断赋值的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!null判断赋值几种写法//当...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作