分享
  1. 首页
  2. 文章

Golang学习笔记之结构体(struct)上

学生黄哲 · · 2182 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

结构体(struct)是用户自定义的类型,它代表若干字段的集合。

• 值类型,赋值和传参会复制全部内容。可用 "_" 定义补位字段,支持指向自身类型的指针成员。
•结构体内字段支持 "=="、 "!=", 结构体就支持相应操作
•可用作 map 键类型。

一、定义

//包内使用首字母小写,包外使用首字母大写
type employee struct {
 firstName string
 lastName string
 age int
}
二、初始化的几种方式
 //初始化方式1
 var emp1 employee
 emp1.firstName = "hello"
 emp1.lastName = "world"
 emp1.age = 20
 fmt.Println(emp1)
 //初始化方式2利用键值方式
 emp2 := employee{
 firstName: "Sam",
 age: 25,
 lastName: "Anderson", //使用键值方式这个逗号不可以省略
 }
 fmt.Println(emp2)
 //初始化方式3顺序初始化,必须包含全部字段,否则会出错。
 emp3 := employee{"Thomas", "Paul", 29}
 fmt.Println(emp3)
三、支持匿名结构
//匿名结构,可用作结构成员或定义变量。
type file struct {
 name string
 size int
 attr struct {
 perm int
 owner int
 }
}
func main() {
//匿名结构
 f := file{
 name: "test.txt",
 size: 1025,
 // attr: {0755, 1}, //组合文字中缺少类型
 }
 f.attr.owner = 1
 f.attr.perm = 0755
 var attr = struct {
 perm int
 owner int
 }{2, 0755}
 f.attr = attr
 fmt.Println(f.attr.perm)
}
四、匿名字段

•通俗来说是一个与成员类型同名 (不含包名) 的字段。
•被匿名嵌入的可以是任何类型,包括指针。
•不能同时嵌入某一类型和其指针类型,因为它们名字相同。
•匿名字段可以字段提升。可以像普通字段那样访问匿名字段成员,编译器从外向内逐级查找所有层次的匿名字段,直到发现目标或出错。但结构体匿名字段外层同名字段会遮蔽嵌入字段成员

//匿名字段
type person struct {
 string
 int
 employee
}
func main(){
 //匿名字段会把类型用作变量名
 p := person{"Hello", 20, emp1}
 p.string = "Other"
 fmt.Println(p, p.string) //{Other 20} Other
 fmt.Println(p.lastName)//等价于p.employee.lastName//输出:hello
}
五、结构体嵌套
//结构体嵌套
type address struct {
 city, state string
}
type student struct {
 name string
 age int
 address address
}
func main(){
 //结构体嵌套
 var s student
 s.name = "小明"
 s.age = 18
 s.address = address{
 city: "北京",
 state: "中国",
 }
 fmt.Println(s)
 fmt.Println(s.name)
 fmt.Println(s.address.city)
}

完整代码实例

package main
import (
 "fmt"
)
//需要添加注释或者改成非导出变量(首字母小写)
type employee struct {
 firstName string
 lastName string
 age int
}
//匿名字段
type person struct {
 string
 int
 employee
}
//结构体嵌套
type address struct {
 city, state string
}
type student struct {
 name string
 age int
 address address
}
//匿名结构,可用作结构成员或定义变量。
type file struct {
 name string
 size int
 attr struct {
 perm int
 owner int
 }
}
func main() {
 //初始化方式1
 var emp1 employee
 emp1.firstName = "hello"
 emp1.lastName = "world"
 emp1.age = 20
 fmt.Println(emp1)
 //初始化方式2利用键值方式
 emp2 := employee{
 firstName: "Sam",
 age: 25,
 lastName: "Anderson", //使用键值方式这个逗号不可以省略
 }
 fmt.Println(emp2)
 //初始化方式3顺序初始化,必须包含全部字段,否则会出错。
 emp3 := employee{"Thomas", "Paul", 29}
 fmt.Println(emp3)
 //结构体指针
 emp5 := &employee{"Sam", "Anderson", 55}
 fmt.Println("First Name:", (*emp5).firstName)
 fmt.Println("Age:", (*emp5).age)
 //匿名字段会把类型用作变量名
 p := person{"Hello", 20, emp1}
 p.string = "Other"
 fmt.Println(p, p.string) //{Other 20} Other
 fmt.Println(p.lastName)//等价于p.employee.lastName//输出:hello
 //匿名结构
 f := file{
 name: "test.txt",
 size: 1025,
 // attr: {0755, 1}, //组合文字中缺少类型
 }
 f.attr.owner = 1
 f.attr.perm = 0755
 var attr = struct {
 perm int
 owner int
 }{2, 0755}
 f.attr = attr
 fmt.Println(f.attr.perm)
 //结构体嵌套
 var s student
 s.name = "小明"
 s.age = 18
 s.address = address{
 city: "北京",
 state: "中国",
 }
 fmt.Println(s)
 fmt.Println(s.name)
 fmt.Println(s.address.city)
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:学生黄哲

查看原文:Golang学习笔记之结构体(struct)上

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2182 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏