Go语言 带你了解结构体及其注意事项
<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> 结构体所有字段在内存中是连续的 结构体是用户单独定义的类型,和其他类型进行转换是需要有完全相同的字段(名字,个数和类型) 结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转 struct的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化 您可能感兴趣的文章:
序列化使用场景:
函数的调用方式: 函数名(实参列表)
方法的调用方式: 变量.方法名(实参列表)</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语言基础入门(一)