类型
名称
长度
默认值
说明
pointer
指针
nil
array
数组
0
slice
切片
nil
引⽤类型
map
字典
nil
引⽤类型
struct
结构体
如果要存储班级里所有学生的数学成绩,应该怎样存储呢?可能有同学说,通过定义变量来存储。但是,问题是班级有80个学生,那么要定义80个变量吗?
像以上情况,最好是通过数组的方式来存储。
所谓的数组:是指一系列同一类型数据的集合。
1
var a
[
`10]
int`
数组定义也是通过var关键字,后面是数组的名字a,长度是10,类型是整型。表示:数组a能够存储10个整型数字。也就是说,数组a的长度是10。
我们可以通过len( )函数测试数组的长度,如下所示:
1
2
var a
[
`10]
int`
fmt.
`Println(
len`(a))
//10
当定义完成数组a后,就在内存中开辟了10个连续的存储空间,每个数据都存储在相应的空间内,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。
注意:数组的长度只能是常量。以下定义是错误的:
1
2
var n
int
=
10
var
a [n]
`int`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package
main
import
"fmt"
func
main(){
// 1.定义结构体
type
Student
struct
`{`
id
int
name
string
age
int
addr
string
}
//2.结构体初始化1,值的顺序与结构体成员的顺序保持一致
chary := Student{
`1,
"chary",
18,
"上海"`}
fmt.
`Println`(chary)
//{1 chary 18 上海}
//2.结构体初始化2,没有初始化的成员自动赋值0
jeff := Student{name:
`"jeff"`}
//{0 jeff 0 }
fmt.
`Println`(jeff)
//3.成员使用
chary.id =
100
//修改
fmt.
`Println`(chary.id )
//4.结构体比较,两个结构体可以使用 == 或 != 运算符进行比较,但不支持 > 或 <。
fmt.
`Println`(jeff==chary)
//false
//5.同类型的两个结构体变量可以相互赋值。
var
user Student
user = jeff
fmt.
`Println`(user)
//{0 jeff 0 }
}
一般情况下,定义结构体的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。
当匿名字段也是一个结构体的时候,那么这个结构体所拥有的全部字段都被隐式地引入了当前定义的这个结构体。
1
2
3
4
5
6
7
8
9
10
11
12
//人
type
Person
struct
{
name
string
sex
byte
age
int
}
//学生
type
Student
struct
{
Person
//匿名字段,那么默认Student就包含了Person的所有字段
id
int
addr
string
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//人
type
Person
struct
{
name
string
sex
byte
age
int
}
//学生
type
Student
struct
{
Person
`//匿名字段,那么默认Student就包含了Person的所有字段`
id
int
addr
string
}
func
main() {
//顺序初始化
s1 := Student{Person{
`"mike",
'm',
18},
1,
"sz"`}
//s1 = {Person:{name:mike sex:109 age:18}id:1 addr:sz}
fmt.Printf(
`"s1=%+vn"`,s1)
//s2 := Student{"mike",'m',18,1,"sz"}//err
//部分成员初始化1
s3 := Student{Person:Person{
`"lily",
'f',
19},id:
2`}
//s3 = {Person:{name:lily sex:102 age:19}id:2 addr:}
fmt.Printf(
`"s3=%+vn"`,s3)
//部分成员初始化2
s4 := Student{Person:Person{name:
`"tom"},id:
3`}
//s4 = {Person:{name:tomsex:0age:0}id:3addr:}
fmt.Printf(
`"s4=%+vn"`,s4)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
var s1
Student
`//变量声明`
//给成员赋值
s1.name =
"mike"
`//等价于s1.Person.name="mike"`
s1.sex =
'm'
s1.age =
18
s1.id =
1
s1.addr =
"sz"
fmt.
`Println`(s1)
//{{mike 109 18}1 sz}
var
s2 Student
`//变量声明`
s2.Person = Person{
`"lily",
'f',
19`}
s2.id =
2
s2.addr =
"bj"
fmt.
`Println`(s2)
//{{lily 102 19}2 bj}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//人
type
Person
struct
`{`
name
string
sex
byte
age
int
}
//学生
type
Student
struct
`{`
Person
//匿名字段,那么默认Student就包含了Person的所有字段
id
int
addr
string
name
string
//和Person中的name同名
}
func
main(){
var
s Student
`//变量声明`
//给Student的name,还是给Person赋值?
s.name =
"mike"
//{Person:{name:sex:0age:0}id:0addr:name:mike}
fmt.Printf(
`"%+vn"`,s)
//默认只会给最外层的成员赋值
//给匿名同名成员赋值,需要显示调用
s.Person.name =
"yoyo"
//Person:{name:yoyosex:0age:0}id:0addr:name:mike}
fmt.Printf(
`"%+vn"`,s)
}
所有的内置类型和自定义类型都是可以作为匿名字段的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type
mystr
string
`//自定义类型`
type
Person
struct
{
name
string
sex
byte
age
int
}
type
Student
struct
{
Person
//匿名字段,结构体类型
int
//匿名字段,内置类型
mystr
//匿名字段,自定义类型
}
func
main() {
//初始化
s1 := Student{Person{
`"mike",
'm',
18},
1,
"bj"`}
//{Person:{name:mikesex:109age:18}int:1mystr:bj}
fmt.Printf(
`"%+vn"`,s1)
//成员的操作,打印结果:mike,m,18,1,bj
fmt.Printf(
`"%s,%c,%d,%d,%sn",s1.name,s1.sex,s1.age,s1.
int`,s1.mystr)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
type
Person
struct
{
//人
name
string
sex
byte
age
int
}
type
Student
struct
{
`//学生`
*Person
//匿名字段,结构体指针类型
id
int
addr
string
}
func
main() {
//初始化
s1 := Student{&Person{
`"mike",
'm',
18},
1,
"bj"`}
//{Person:0xc0420023e0id:1addr:bj}
fmt.Printf(
`"%+vn"`,s1)
//mike,m,18
fmt.Printf(
`"%s,%c,%dn"`,s1.name,s1.sex,s1.age)
//声明变量
var
s2 Student
s2.Person =
new
`(Person)`//分配空间
s2.name =
"yoyo"
s2.sex =
'f'
s2.age =
20
s2.id =
2
s2.addr =
"sz"
//yoyo10220220
fmt.
`Println`(s2.name,s2.sex,s2.age,s2.id,s2.age)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package
main
import
(
"fmt"
"sync"
)
type
UserAges
struct
{
ages
map
`[string
]
int`
sync.Mutex
}
func
(u *UserAges)Add(name
string
`,age
int`) {
u.Lock()
defer
u.Unlock()
u.ages[name] = age
}
func
(u *UserAges)Get(name
string
`)int
{`
if
age,ok:=u.ages[name];ok{
return
age
}
return
-
`1`
}
func
main() {
dic:=
`make(
map[
string]
int`)
dic[
`"age"`] =
18
r:=UserAges{ages: dic}
r.Add(
`"jeff",
20`)
fmt.
`Println`(r)
age:=r.Get(
`"age"`)
fmt.
`Println`(age)
}
以上就是go语言数组及结构体继承和初始化示例解析的详细内容,更多关于go语言数组及结构体继承和初始化的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:
原网址: 访问
创建于: 2022-09-06 18:50:53
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论