Go语言入门心法(二): 结构体


Go语言入门心法(一)

Go语言入门心法(二): 结构体

Go语言入门心法(三): 接口

Go语言入门心法(四): 异常体系

 Go语言入门心法(五): 函数

Go语言入门心法(六): HTTP面向客户端|服务端编程

Go语言入门心法(七): 并发与通道

Go语言入门心法(八): mysql驱动安装报错onnection failed

Go语言入门心法(九): 引入三方依赖

Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理

Go语言入门心法(十一): 文件处理




一: Go语言中结构体认知


 

go语言中的结构体认知升维:

               go语言中的结构体本身是一种自定义的数据类型,即然是数据类型,则可以用来声明其他的变量,被声明的变量即为结构体的实例对象
            go语言中的结构体融合了c语言中的结构体体征和面向对象的java|python中的类的特性
             go中结构体通常分为两种
                 (1)普通结构体
                 (2)匿名结构体
              go语言中结构体实例化: 通常我们要使用结构体中的成员变量与方法时,都需要先实例化结构体,再通过实例化对象来操作结构体重的成员属性和
              成员方法;
               go语言中实例化结构体有四种方法:
                  (1) 标准实例化格式: var 机构体实例 结构体数量类型
                  (2) new(结构体类型)函数实例化,实例化完成后会返回结构体的指针类型
                  (3) 取地址实例化与new函数进行实例化类似,返回的是结构体指针类型,取地址实例化格式如下: 结构体实例 := &结构体类型{}
                  (4) 结构体名{}:该实例化的对象称为非指针类型对象:var book = 结构体类型{}

实例一: 普通结构体 

package main

import "fmt"

/*
go语言中的结构体认知升维:

	            go语言中的结构体本身是一种自定义的数据类型,即然是数据类型,则可以用来声明其他的变量,被声明的变量即为结构体的实例对象
				go语言中的结构体融合了c语言中的结构体体征和面向对象的java|python中的类的特性
			    go中结构体通常分为两种
			        (1)普通结构体
			        (2)匿名结构体
		        go语言中结构体实例化: 通常我们要使用结构体中的成员变量与方法时,都需要先实例化结构体,再通过实例化对象来操作结构体重的成员属性和
		        成员方法;
	            go语言中实例化结构体有三种方法:
	                 (1) 标准实例化格式: var 机构体实例 结构体数量类型
	                 (2) new(结构体类型)函数实例化,实例化完成后会返回结构体的指针类型
	                 (3) 取地址实例化与new函数进行实例化类似,返回的是结构体指针类型,取地址实例化格式如下: 结构体实例 := &结构体类型{}
*/
func main() {
	println(`
       go语言中的结构体与c语言中的结构体类似;
       go语言中的结构体相当于java|python中类功能相当
   `)

	type Book struct {
		title    string // 标题
		author   string // 作者
		numCount int    // 数量
		id       int64  // 编号id
	}

	println("go语言中的结构体定义中,如果变量类型相同的结构体成员,可以将它们写在同一行")

	type Person struct {
		name, address, schoolName string // 名称,地址,毕业学校
		age                       int    // 年龄
		sex                       int    // 性别: 0-男;1-女
		marry                     bool   // 是否结婚
	}
	println()
	println("===================================第一种实例化结构体的方式===============================")
	// 创建类的实例标量 person
	var person Person
	// 修改属性的默认值
	person.schoolName = "清华大学"
	println("实例化Person结构体: ", person.schoolName)
	println()
	fmt.Println(person)
	println()
	fmt.Println("结构体实例化第二种方式:")
	println("===================================第二种实例化结构体的方式===============================")
	book := new(Book)
	book.author = "老杨"
	book.title = "go语言零从入门到放弃"
	println(book)
	fmt.Println(book)
	println(book.title)

	println("====================================第三种实例化结构体的方式==============================")
	// 实例化动物结构体
	an := &Animal{
		"菲拉斯",
		"猫科",
		20,
	}

	fmt.Println("Name : ", an.name, " , age : ", an.age, ", type: ", an.typeName)
	println("喵喵名称: ", an.name)
	// 调用结构体的方法
	an.ChangeName()
	println("调用结构体方法修改猫咪名称: ", an.name)
}

// Animal 声明一个表示动物的结构体
type Animal struct {
	name     string
	typeName string
	age      int
}

// ChangeName 结构体的方法
func (an *Animal) ChangeName() {
	an.name = "小猫迷,芳芳"
}

运行效果:


GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_BookStructGrammar_go.exe D:\program_file\go_workspace\org.jd.data\struct\BookStructGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_BookStructGrammar_go.exe

       go语言中的结构体与c语言中的结构体类似;
       go语言中的结构体相当于java|python中类功能相当

go语言中的结构体定义中,如果变量类型相同的结构体成员,可以将它们写在同一行

===================================第一种实例化结构体的方式===============================
实例化Person结构体:  清华大学


{  清华大学 0 0 false}

结构体实例化第二种方式:
===================================第二种实例化结构体的方式===============================
0xc000194060
&{go语言零从入门到放弃 老杨 0 0}
go语言零从入门到放弃
====================================第三种实例化结构体的方式==============================
Name :  菲拉斯  , age :  20 , type:  猫科

Process finished with the exit code 0


二: 匿名结构体认知


go语言中匿名结构体认知:

    go语言中通过内嵌套结构体的方式来实现继承;类似于其他语言中的类的继承和派生类的角色
    子结构体中继承了父结构体中的结构体属性及结构体方法;结构体内嵌式一种组合特性,使用结构体内嵌是可构建一种面向对象编程思想中的继承关系;
    匿名结构体定义与初始化:
        匿名结构体,顾名思义,即结构体没有名称,与匿名函数类型。匿名结构体无须type关键字就可以直接使用
    匿名结构体在创建的同时也要创建对象;匿名结构体的初始化更加简单,无须通过type关键字定义,且不用写出类型名称。
    匿名结构体在初始化时需进行匿名结构体定义和成员变量初始化【可选】

 


 实例二:匿名结构体


package main

import (
	"encoding/json"
	"fmt"
)

/*
go语言中匿名结构体认知:

	go语言中通过内嵌套结构体的方式来实现继承;类似于其他语言中的类的继承和派生类的角色
	子结构体中继承了父结构体中的结构体属性及结构体方法;结构体内嵌式一种组合特性,使用结构体内嵌是可构建一种面向对象编程思想中的继承关系;
    匿名结构体定义与初始化:
        匿名结构体,顾名思义,即结构体没有名称,与匿名函数类型。匿名结构体无须type关键字就可以直接使用
    匿名结构体在创建的同时也要创建对象;匿名结构体的初始化更加简单,无须通过type关键字定义,且不用写出类型名称。
    匿名结构体在初始化时需进行匿名结构体定义和成员变量初始化【可选】

*/

// Book 定义书籍结构体
type Book struct {
	title      string
	author     string
	publishNum int
	id         string
}

// Book结构体的方法
func (b *Book) setAuthor(authorName string) {
	b.author = authorName
}

// BookBorrow 声明可供借阅的数据结构体
type BookBorrow struct {
	Book
	borrowTime string // 归还日期
}

type BookNotBorrow struct {
	Book
	readTime string // 借阅日期
}

func main() {
	println("==========================go语言初始化第一种方式======================")
	bookBorrow := &BookBorrow{ // 使用类似map键值对信息实例化
		Book: Book{
			"线性代数",
			"老张",
			2000,
			"987-2354-454-33-211",
		},
		borrowTime: "300",
	}
	fmt.Println(bookBorrow)
	fmt.Println("借阅的书籍:", bookBorrow.Book.title)
	println("==========================go语言初始化第二种方式======================")
	bookNotBorrow := new(BookNotBorrow)
	bookNotBorrow.title = "Java底层实现机制"
	bookNotBorrow.author = "老杨"
	bookNotBorrow.publishNum = 5000
	bookNotBorrow.readTime = "2023/10/13"
	bookNotBorrow.id = "987-2354-454-365-289"
	fmt.Println(bookNotBorrow)
	println("调用从父类继承的方法,修改作者名称:")
	println()
	bookNotBorrow.setAuthor("清华大学出版社")
	fmt.Println(bookNotBorrow)

	println("===========================go语言中匿名结构体=================================")
	// 定义匿名结构体并初始化化
	cat := struct {
		name     string
		age      int
		category string
	}{
		name:     "喵喵",
		age:      20,
		category: "猫科",
	}

	println("匿名结构体:")
	fmt.Println(cat)
	fmt.Println(cat.category)
	fmt.Println(cat.name)
	fmt.Println(cat.age)

	println(`
       匿名结构体的应用:
          匿名结构体一般可以组织全局变量,构建数据模版,解析JSON等
    `)
	// 使用匿名结构体定义全局变量
	var config struct {
		IP   string
		Port int
	}
	config.Port = 3306
	config.IP = "192.168.1.234"
	println("全局变量", config.IP)

	// 定义一个表示异常的结构体,来接收json的字符串窗
	data := &struct {
		Code    int
		Message string
	}{}
	jsonData := `{"code": 200,"message":"系统异常"}`
	if err := json.Unmarshal([]byte(jsonData), data); err != nil {
		println(err)
	}

	fmt.Println("Code: ", data.Code)
	fmt.Println("Message: ", data.Message)

}

 实例运行效果:


GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_AnonymityStructGrammar_go.exe D:\program_file\go_workspace\org.jd.data\struct\AnonymityStructGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_AnonymityStructGrammar_go.exe
==========================go语言初始化第一种方式======================
&{{线性代数 老张 2000 987-2354-454-33-211} 300}
借阅的书籍: 线性代数
==========================go语言初始化第二种方式======================
&{{Java底层实现机制 老杨 5000 987-2354-454-365-289} 2023/10/13}
调用从父类继承的方法,修改作者名称:

&{{Java底层实现机制 清华大学出版社 5000 987-2354-454-365-289} 2023/10/13}
===========================go语言中匿名结构体=================================
匿名结构体:
{喵喵 20 猫科}
猫科
喵喵
20

       匿名结构体的应用:
          匿名结构体一般可以组织全局变量,构建数据模版,解析JSON等

全局变量 192.168.1.234
Code:  200
Message:  系统异常

Process finished with the exit code 0
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值