教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go语言 带你了解结构体及其注意事项

Go语言 带你了解结构体及其注意事项

发布时间:2022-01-07   编辑:jiaochengji.com
教程集为您提供Go语言 带你了解结构体及其注意事项等资源,欢迎您收藏本站,我们将为您提供最新的Go语言 带你了解结构体及其注意事项资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

<h3>Go语言 结构体</h3> <ul><li>结构体</li><li>结构体在内存分布</li><li>结构体特征:</li><li>结构体注意事项和细节</li><li>方法注意事项和细节讨论</li><li>方法和函数的区别</li></ul>

<h1>结构体</h1> <pre><code class="lang-php hljs">package main import <span class="token double-quoted-string string">"fmt"</span> import <span class="token double-quoted-string string">"encoding/json"</span> <span class="token comment">/* 结构体定义方式 type struct_name struct{ 变量名 type } 结构体特征: 1.当字段或者结构体以大写字母开头则表示其为public,引用类型强制为public 2.在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值,引用类型的零值为nil,即没有分配空间,所以当使用这样的字段所以先make才能使用 ,指针则为new 3.结构体是值类型 4.不同结构体变量的字段是独立,互不影响 结构体注意事项和细节: 1.结构体所有字段在内存中是连续的 2.结构体是用户单独定义的类型,和其他类型进行转换是需要有完全相同的字段(名字,个数和类型) 3. 结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转 4. struct的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化 */</span> <span class="token comment">//定义一个Cat类型的结构体,字段有:名字,年龄,颜色</span> type Cat struct <span class="token punctuation">{</span> Name string `json<span class="token punctuation">:</span><span class="token double-quoted-string string">"name"</span>` Age int `json<span class="token punctuation">:</span><span class="token double-quoted-string string">"age"</span>` Color string `json<span class="token punctuation">:</span><span class="token double-quoted-string string">"color"</span>` <span class="token punctuation">}</span> <span class="token comment">//定义结构体中的方法 func (变量 type) 方法(参数列表)(返回列表)</span> <span class="token comment">//注意cat *Cat是引用传递</span> func <span class="token punctuation">(</span>cat <span class="token operator">*</span>Cat<span class="token punctuation">)</span><span class="token function">eat</span><span class="token punctuation">(</span>food string<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//cat.Name等价于(*cat).Name</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"%s喜欢吃%s"</span><span class="token punctuation">,</span>cat<span class="token punctuation">.</span>Name<span class="token punctuation">,</span>food<span class="token punctuation">)</span> cat<span class="token punctuation">.</span>Name<span class="token operator">=</span><span class="token double-quoted-string string">"小陈"</span> <span class="token punctuation">}</span> func <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//创建结构体实例四种方式</span> <span class="token comment">//第一种 var 变量名 struct_name</span> <span class="token keyword">var</span> cat1 Cat cat1<span class="token punctuation">.</span>Name <span class="token operator">=</span> <span class="token double-quoted-string string">"小白"</span> cat1<span class="token punctuation">.</span>Age <span class="token operator">=</span> <span class="token number">3</span> cat1<span class="token punctuation">.</span>Color <span class="token operator">=</span> <span class="token double-quoted-string string">"白色"</span> <span class="token comment">//第二种 变量名:=struct_name{}</span> cat2 <span class="token punctuation">:</span><span class="token operator">=</span> Cat<span class="token punctuation">{</span><span class="token double-quoted-string string">"小黑"</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token double-quoted-string string">"黑色"</span><span class="token punctuation">}</span> <span class="token comment">//第三种 var 变量名 *struct_name =new (struct_name)</span> <span class="token keyword">var</span> cat3 <span class="token operator">*</span>Cat <span class="token operator">=</span> <span class="token keyword">new</span><span class="token punctuation">(</span>Cat<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token operator">*</span>cat3<span class="token punctuation">)</span><span class="token punctuation">.</span>Name <span class="token operator">=</span> <span class="token double-quoted-string string">"小绿"</span> <span class="token punctuation">(</span><span class="token operator">*</span>cat3<span class="token punctuation">)</span><span class="token punctuation">.</span>Age <span class="token operator">=</span> <span class="token number">5</span> <span class="token punctuation">(</span><span class="token operator">*</span>cat3<span class="token punctuation">)</span><span class="token punctuation">.</span>Color <span class="token operator">=</span> <span class="token double-quoted-string string">"绿色"</span> <span class="token comment">//第四种 var 变量名 *struct_name =&struct_name{}</span> <span class="token keyword">var</span> cat4 <span class="token operator">*</span>Cat <span class="token operator">=</span> <span class="token operator">&</span>Cat<span class="token punctuation">{</span><span class="token double-quoted-string string">"小蓝"</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token double-quoted-string string">"蓝色"</span><span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>cat1<span class="token punctuation">)</span> <span class="token comment">//{小白 3 白色}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>cat2<span class="token punctuation">)</span> <span class="token comment">//{小黑 4 黑色}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token operator">*</span>cat3<span class="token punctuation">)</span> <span class="token comment">//{小绿 5 绿色}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token operator">*</span>cat4<span class="token punctuation">)</span> <span class="token comment">//{小蓝 6 蓝色}</span> <span class="token comment">//struct的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化</span> jsonStr<span class="token punctuation">,</span>err <span class="token punctuation">:</span><span class="token operator">=</span>json<span class="token punctuation">.</span><span class="token function">Marshal</span><span class="token punctuation">(</span>cat1<span class="token punctuation">)</span> <span class="token keyword">if</span> err <span class="token operator">!=</span>nil<span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"json 解析错误"</span><span class="token punctuation">,</span>err<span class="token punctuation">)</span> <span class="token punctuation">}</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>jsonStr<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">//{"name":"小白","age":3,"color":"白色"}</span> <span class="token comment">//cat1.eat("鱼")等价于(&cat1).eat("鱼")</span> cat1<span class="token punctuation">.</span><span class="token function">eat</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"鱼"</span><span class="token punctuation">)</span> <span class="token comment">//小白喜欢吃鱼</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>cat1<span class="token punctuation">.</span>Name<span class="token punctuation">)</span> <span class="token comment">//小陈</span> <span class="token punctuation">}</span> </code></pre> <h1>结构体在内存分布</h1>

<h1>结构体特征:</h1> <ol><li>当字段或者结构体以大写字母开头则表示其为public,引用类型强制为public</li><li>在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值,引用类型的零值为nil,即没有分配空间,所以当使用这样的字段所以先make才能使用,指针则为new</li><li>结构体是值类型</li><li>不同结构体变量的字段是独立,互不影响</li></ol><h1>结构体注意事项和细节</h1> <ul><li>

结构体所有字段在内存中是连续的

</li><li>

结构体是用户单独定义的类型,和其他类型进行转换是需要有完全相同的字段(名字,个数和类型)

</li><li>

结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转

</li><li>

struct的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化
序列化使用场景:

</li></ul><h1>
方法注意事项和细节讨论</h1> <ul><li>结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式</li><li>如果程序员希望在方法中,修改结构体变量的值,可以通过结构体指针的方式来处理</li><li>Golang中方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct,比如int,flaot32都可以</li><li>方法的访问范围控制的规则,和函数一样.方法名首字母小写,只能在本包访问,方法首字母大写开头在本包和其他包访问</li><li>如果一个类型实现String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出</li></ul><h1>方法和函数的区别</h1> <ul><li>调用方式不一样
函数的调用方式: 函数名(实参列表)
方法的调用方式: 变量.方法名(实参列表)</li><li>对于普通函数,接收者为 值类型时,不能将指针类型的数据直接传递,反之亦然</li><li>对于方法,接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以</li></ul> 到此这篇关于“Go语言 带你了解结构体及其注意事项”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
从零开始学习GO语言-搭建Go语言开发环境-快速开发入门第一个小程序
Go 语言到底适合干什么?
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
go 函数末尾缺少返回值_王垠:Go语言野心勃勃,实际情况又如何
Go语言发展历史、核心、特性及学习路线
想学一门新的编程语言?考虑一下Go (Golang)吧
Go 语言十年而立,Go2 蓄势待发
go run main.go 参数_Go语言入门:Hello world
兄弟连golang神技(1)-关于 Go 语言的介绍
查看go 安装了哪些包_go语言基础入门(一)

[关闭]
~ ~