欢迎来到起航培训网!
北京
切换分站
QQ:1879460140
课程分类
    Go语言中什么是结构体?struct特点有哪些?老男孩Go开
    2022-01-19发布, 次浏览 收藏 置顶 举报
Go语言中什么是结构体?struct特点有哪些?老男孩Go开
  • 区域:昌平
  • 上课班制:随到随学
  • 课程类型:普通课程
  • 网报价格:¥1    课程原价:¥1
  • 咨询热线:18710030740
  • 课程详情
  • 机构简介
  • 地图信息
  • 网上报名



Go语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

struct特点

1、用来自定义复杂数据结构

2、struct里面可以包含一个或多个字段(属性)

3、struct类型可以定义方法,注意和函数的区分

4、struct类型是值类型

5、struct类型可以嵌套

6、结构体是用户单独定义的类型,不能和其他类型进行强制转换

7、Go中的struct没有构造函数,一般可以使用工厂模式来解决这个问题

8、我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化

9、访问结构体成员, 用 "." 来连接,格式为:"结构体.成员名"

struct定义

可用 type 在全局或函数内定义新类型。

第一种,定义一个新的数据类型,结构体中只有一个成员。

type bigint int64

type smallint int8

新类型不是原类型的别名,除拥有相同数据存储结构外,它们之间没有任何关系,不会持有原类型任何信息。除非目标类型是未命名类型,否则必须显式转换。

第二种,定义一个新的数据类型,结构体中有多个成员。

type oldboy struct {

Linux string

Python string

Golang string

}

第三种,定义一个新的数据类型,指向结构体的指针。

type Linux string

type oldboy struct {

*Linux

}

不能同时嵌入某一类型和其指针类型,因为它们名字相同。实例如下:

package main

type Linux string

type oldboy struct {

*Linux

Linux

}

func main() {

}

编译错误:

./main.go:7:2: duplicate field Linux

struct 初始化

有序初始化: 结构体中的多个成员的值,必须一一对应。

无序初始化: 结构体中的多个成员的值,无须一一对应,可初始化部分值。

package main

type oldboy struct {

Linux string

Python string

Golang string

}

// 有序初始化

var ordered = oldboy{"linux", "python", "golang"}

// 无序初始化

var disordered = oldboy{Golang: "golang"}

func main() {

}

结构体初始化方法有如下几种:

package main

import (

"fmt"

)

type oldboy struct {

int

string

}

var one oldboy

func main() {

two := new(oldboy) //同 var two *oldboy = new(oldboy)

three := oldboy{1, "three"}

four := oldboy{}

five := &oldboy{}

six := &oldboy{2, "six"} //同 var six *oldboy = &oldboy{2, "six"}

fmt.Println(one, two, three, four, five, six)

}

one three four返回oldboy类型变量;two five six返回*oldboy类型变量;若无初始化值,则默认为零值。

匿名字段

定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go语言支持只提供类型,而不写字段名的方式,也就是匿名字段,或称为嵌入字段。

当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。

package main

import (

"fmt"

)

type Person struct {

name string

age int

addr string

}

type Employee struct {

Person //匿名字段

salary int

int //用内置类型作为匿名字段

addr string //类似于重载

}

func main() {

em1 := Employee{

Person{"oldboy", 18, "北京"},

10,

100,

"首都",

}

fmt.Println(em1)

var em2 Person = em1.Person

fmt.Println(em2)

}

struct与tag应用

声明struct结构的时候,在属性的右侧用小米点括起来的内容叫标签(Tag),在转换成其它数据格式的时候,会使用其中特定的字段作为键值。例如转成json格式,实例如下:

package main

import (

"encoding/json"

"fmt"

)

type User struct {

UserId int

UserName string

}

type UserTag struct {

UserId int `json:"user_id" bson:"user_id"`

UserName string `json:"user_name" bson:"user_name"`

}

func main() {

user := &User{UserId: 1, UserName: "oldboy"}

json_user, _ := json.Marshal(user)

fmt.Printf("struct User echo : %v\n", string(json_user))

user_tag := &UserTag{UserId: 1, UserName: "oldboy"}

json_user_tag, _ := json.Marshal(user_tag)

fmt.Printf("struct UserTag echo : %v\n", string(json_user_tag))

}

运行结果:

struct User echo : {"UserId":1,"UserName":"oldboy"}

struct UserTag echo : {"user_id":1,"user_name":"oldboy"}

标签是struct类型的组成部分:

package main

var user1 struct {

UserId int `json:"user_id"`

}

var user2 struct {

UserId int `bson:"user_id"`

}

func main() {

user1 = user2

}

编译错误:

./main.go:11:8: cannot use user2 (type struct { UserId int "bson:\"user_id\"" }) as type struct { UserId int "json:\"user_id\"" } in assignment

老男孩教育专注Linux云计算运维工程师、Python全栈+人工智能、Python自动化运维开发、网络安全、数据分析、新媒体运营、MySQLDBA开发、K8S微服务、Go语言等互联网课程培训。欢迎对it行业感兴趣的朋友们来公司考察及学习。

联系我时请说明是在起航培训网看到的,谢谢!

注意:起航培训网只是架起培训机构与学员之间的一道桥梁,帮助培训机构找学员,帮助学员找培训机构的平台,不产生金钱交易,如果你有资金往来,请及时通过电话与对方联系,调查清楚,确认无误在选择,否则造成你的损失,由自己承担,本平台概不负责,谢谢!

老男孩教育(北京一天天教育科技有限公司)于2013年在北京注册成立,专注互联网IT技术人才培训和企业内训服务,Linux云计算运维、Python开发培训的行业领军者。现已为社会输送数万名IT技术人员。 在北京、深圳均设有分校,2019年5月,同时在校面授学员3000余人,线上学员1500余人;在册员工160人,其中讲师&教研团队占60%+,已开设学科近10门,覆盖技术从业者1~8年的职业生涯需求,我们致力于成为线上、线下并驾齐驱,能够为更多有志青年提供优质、前沿IT技术学习资源的平台。 目前,从老男孩毕业的学员,就业于国内各大知名企业如小米、京东、百度、美团、头条、蓝讯,阿里、网易、新浪微博,搜狐,腾讯,汽车之家、58同城、世纪佳缘,小红书、拼多多,中国移动,中国联通、工商银行、中信证券、华夏银行等。很多早期毕业的师兄已在任职企业成长为核心技术骨干。 成立多年来,我们一直秉承保证教学质量才是硬道理的发展观,坚持做正确的事,用心帮助每一位学员通过在老男孩努力学习获得体面的工作和生活。

该机构尚未标注地图位置。

© 起航培训网 豫ICP备2026026690号-1


Fatal error: Call to undefined function makeDir() in D:\phpstudy_pro\Chengxu\vbmcms\include\cachepages.class.php on line 143