Golang 结构体

1. 结构体

Golang 也支持面向对象编程(OOP),但其并不是纯粹的面对对象,可以说是 Golang 支持面对对象编程。Golang 中没有类(class)的概念,Golang 中提供了结构体(struct)的概念用于实现 OOP 特性。

Golang 的面对对象编程十分简洁,去除了传统 OOP 的方法重载、构造函数、隐式的 this 指针等。Golang 具有封装、继承、多态的特性,实现方式与其他的 OOP语言不同,比如继承没有 extends 关键字,而是通过匿名类字段实现等。

1.1 定义结构体

语法格式:

type struct_variable struct {
    Member definition
    Member definition
    ...
    Member definition
}

结构体的访问:

struct_variable.Member

. 操作符也被称为选择器(Selector)!

🌰 定义结构体实例:

type Book struct {
    ISBN int
    Title string
    Author string
}

查看其默认值:

var book Book
fmt.Println(book)  // 输出: {0  }

1.2 创建结构体

1.2.1 基本的实例化形式

语法结构:

func main(){
	var variable1 struct_variable
	variable1.member = value
    ...
}

🌰 结构体的赋值与输出:

func main(){
    var book Book
    book.ISBN = 123456
    book.Title = "GolangStudy"
    book.Author = "JOEL"
    fmt.Println(book)   // 输出: {123456 GolangStudy JOEL}
    fmt.Println(book.Title))   // 输出: GolangStudy
}

1.2.2 简化的实例化形式

语法结构:

func main(){
    // 1:
    variable2 := struct_variable(value, ...)
    // 2:
    variable3 := struct_variable(key : value, ...)
}

🌰 结构体的赋值与输出:

func main(){
	book := Book{123456, "GolangStudy", "JOEL"}
	fmt.Println(book)   // 输出: {123456 GolangStudy JOEL}
}
func main(){
    book := Book{ISBN:123456 ,Title : "GolangStudy", Author:"JOEL"}
	fmt.Println(book)   // 输出: {123456 GolangStudy JOEL}
}
func main(){
	book := Book{Title:"GolangStudy"}
	fmt.Println(book)   // 输出: {0 GolangStudy }
}

1.2.3 new指针的实例化形式

语法结构:

func main(){
    // 1:
    var variable *struct_variable = new(struct_variable)
}

🌰 结构体的赋值与输出:

func main(){
    var book *Book = new(Book)
    (*book).Title = "GolangStudy"
    fmt.Println(book)   // 输出: &{0 GolangStudy }
}

* 的作用是:根据地址取值!

book 为指针类型,保存的是对象的地址,所以赋值时,是给该地址所指向的对象的字段进行赋值,及 (*book).title 的形式。

其实可以简化为 book.title,go编译器底层会自动转化为 (*book).title

1.2.4 返回指针的实例化形式

语法结构:

func main(){
	var variable *struct_variable = &struct_variable{}
}

🌰 结构体的赋值与输出一:

func main(){
	var book *Book = &Book{}
	(*book).ISBN = 123456
	(*book).Title = "GolangStudy"
	book.Author = "JOEL"
	fmt.Println(book)   // 输出: &{123456 GolangStudy JOEL}
}

🌰 结构体的赋值与输出二:

func main(){
	var book *Book = &Book{123456, "GolangStudy", "JOEL"}
	fmt.Println(book)   // 输出: &{123456 GolangStudy JOEL}
}

1.3 结构体之间的强换

1.3.1 结构体强换

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

type Dog struct{
	Name string
	Age int
}

type Cat struct{
	Name string
	Age int
}

func main(){
	var dog Dog = Dog{"汪汪", 2}
	var cat Cat = Cat{"喵喵", 2}
	dog = Dog(cat)
	fmt.Println(dog)   // 输出: {喵喵 2}
    fmt.Println(cat)   // 输出: {喵喵 2}
}

1.3.2 结构体重定义

结构体使用 type 关键字重新定义后(取别名),Golang 认为是新的类型,也可以相互强换

type Student struct{
    Name string
}

type Stu Student

func main(){
    var student Student = Student{"Jack"}
    var stu Stu = Stu{"Tom"}
    student = Student(stu)
    fmt.Println(student)   // 输出: {Tom}
    fmt.Println(stu)   // 输出: {Tom}
}

1.4 匿名字段和内嵌结构体

1.4.1 匿名字段

语法格式:

type struct_variable struct {
    Member definition
    Member definition
    ...
    definition  // 匿名字段
} 

1.4.2 内嵌结构体

语法格式:

type struct_variable struct {
    other_struct
    Member definition
    ...
    Member definition
} 

🌰 内嵌结构体实例:

type Person struct{
	Name string
	Age int
}

type Stu struct{
	ID int
	Person
}

func main(){
	var stu Stu = Stu{ID:12345, Person:Person{"Jack", 2}}
	fmt.Println(stu)   // 输出: {12345 {Jack 2}}
	fmt.Println(stu.ID)   // 输出: 12345
	fmt.Println(stu.Name)   // 输出: Jack
	fmt.Println(stu.Age)   // 输出: 2
}

 


❤️ END ❤️
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值