读书笔记之Go结构体

注:

  1. 结构体就是对象
  2. 结构体是一种复合的基本类型,结构体和基本类型使用方式一模一样!
  3. 初始化可以省略变量名,但必须全部、有序!

关键字type

type 关键字用于自定义一种数据类型,eg:

type myInt int /myInt就是自定义的一种数据类型

type 类型民 struct{ /这个结构体也就是自定义的一种数据类型
	字段名1 T1
	字段名2 T2
	...
}

定义结构体

type 类型民 struct{
	字段名1 T1
	字段名2 T2
	...
}

举例:(字段tags可有可无)
在这里插入图片描述

注:修改一下
在这里插入图片描述

实例化结构体:和基本类型一样

一、普通实例化

var user User
user.Id = 1
user.Name = "Leslie"

二、初始化实例化

最广泛的是取地址实例化:

user := &User{
			Id: 2,
			Name: "Json",
		}

三、直接创建结构体指针

ins 为对象指针!【且Go对struct优化使用了语法糖(将 ins.Id转换为了(*ins).Id),指针可以和变量名一样使用!

ins := new(User)

ins.Id = 2022

四、构造函数创建

传递的是指针:
在这里插入图片描述

匿名结构体

实例化

普通实例化

	var ss struct{
		id int
		name string
	}

初始化实例化

常常采用指针:

	sss := &struct {
		id int
		name string
	}{
		id:1,
	}

面向对象特性实现

一、方法:特定类型的函数

要明确:

  1. Go中的函数就相当于Java工具类方法: 开放函数都直接使用(内建函数),或通过包名调用!
  2. 方法就是给特定类型变量使用的特殊函数!【Java中对象的方法】
  3. 特定类型变量:任何类型都可以
  4. 在方法中这种特定类型变量接收器
  5. 接收器可以是指针、也可以不是!【回想指针、非指针的区别】

请添加图片描述

给对象(特定变量)声明它的方法

调用:接收器.方法名()

	func (接收器变量 接收器类型) 方法名(参数列表)(返回值列表){
		...
	}

同样Java,只能由该对象调用,不能被直接或其他对象调用:

	type User struct {
		Id       int
		Name,Birthday     string
	}
	
	func (u *User) getId() int {
		return u.Id
	}

二、继承:匿名结构体内嵌

【注意:不管多少层都一样,但得保证字段名不重复】
在这里插入图片描述

【注:初始化时把类型看作类型名使用(其实它们的名字就是它们的类型)】

三、实现接口,接口的多态特性!


结构体 <=(指针)=> JSON

注:参数传递都是指针!结构体的属性必须对外开放(首字母大写)才能被json包解析!

序列化:Marshal(v interface{})

json包中的Marshal(v interface{}) ([]byte, error)方法!

	p := NewPhone(10,52.5,"red")
	// 将结构体序列化成json数据流
	data,err := json.Marshal(p)
	fmt.Println(string(data),err)

反序列化:Unmarshal(data []byte, v interface{})

json包中的Unmarshal(data []byte, v interface{}) error

	pp := new(Phone)
	// 将json数据流解析成结构体
	json.Unmarshal(data,pp)
	fmt.Printf("%+v",pp)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值