golang 笔记9 结构体

golang 笔记9 结构体

type

// 自定义类型 [可以定义方法]
type myInt int

// 类型别名
type youInt = int

func TestType(t *testing.T) {
	var x myInt = 100  // package_name.myInt
	var y youInt = 100 // int
	fmt.Printf("%T\n", x)
	fmt.Printf("%T\n", y)
	/**
	=== RUN   TestType
	struct_demo.myInt
	int
	--- PASS: TestType (0.00s)
	PASS
	*/
}

struct 结构体

  1. 函数内部使用
func TestStruct1(t *testing.T) {
	var x struct {
		idNo string
		name string
	}
	x.idNo = "340001"
	x.name = "Jony"
	fmt.Println(x) // {340001 Jony}
}
  1. 结构体 + 自定义类型

// 结构体 + 自定义类型
type Person struct {
	idNo       string
	name       string
	profession string
	age        int
	birthday   time.Time
}

type office struct {
	persons []Person
}

const YYYY_MM_DD = "2006-01-02"

func getTime(timeString string) time.Time {
	t, _ := time.Parse(YYYY_MM_DD, timeString)
	return t
}

// 结构体的方法
func (p Person) printPerson() {
	fmt.Println(p.idNo, p.name, p.profession, p.age, (&p.birthday).Format(YYYY_MM_DD))
}

func TestStruct2(t *testing.T) {
	var person1 Person
	person1.idNo = "341993001"
	person1.name = "morningcat"
	person1.profession = "golang工具人"
	person1.birthday = getTime("1993-04-05")
	person1.age = 28
	person1.printPerson() // 341993001 morningcat golang工具人 28 1993-04-05
}
  1. 值拷贝
func changeName(p Person) { // 值拷贝
	p.name = "hello"
}

func changeName2(p *Person) { // 引用
	(*p).name = "hello"
	//p.name = "hello" // 语法糖 解析成上诉语句
}

func TestStruct3(t *testing.T) {
	var person Person
	person.name = "morningcat"

	changeName(person)
	fmt.Println(person.name) // morningcat

	changeName2(&person)
	fmt.Println(person.name) // hello
}

func TestStruct4(t *testing.T) {
	var person *Person = new(Person) // Person指针 (结构体指针)

	changeName2(person)
	fmt.Println(person.name)
}
  1. 初始化方式
func TestStruct5(t *testing.T) {
	// 初始化
	var person3 = Person{idNo: "3419901", name: "mengzhang6", profession: "java", age: 28, birthday: getTime("1993-12-01")}
	person3.printPerson()

	// 格式化
	var person4 = Person{
		idNo:       "3419901",
		name:       "mengzhang6",
		profession: "java",
		age:        28,
		birthday:   getTime("1993-12-01"),
	}
	person4.printPerson()

	// 全量赋值 可省略key
	var person5 = Person{"3419901", "mengzhang6", "java", 28, getTime("1993-12-01")}
	person5.printPerson()
}
  1. 作用于特定类型的函数

// 作用于特定类型的函数
// 任意自定义类型都可以加方法
// 只能给自己 package 中的`自定义类型`添加方法

func NewPerson(idNo, name string) *Person {
	return &Person{idNo: idNo, name: name}
}

func (p Person) GetPersonStr() string { //  值接收者
	return fmt.Sprintf(p.idNo, p.name, p.profession, p.age, (&p.birthday).Format(YYYY_MM_DD))
}

func TestStruct6(t *testing.T) {
	var p *Person = NewPerson("3419002", "morningcat")
	fmt.Println(p.GetPersonStr())
}

func (p *Person) ChangrPersonName(name string) { // 指针接收者
	p.name = name
}

func TestStruct7(t *testing.T) {
	var p = NewPerson("3419002", "morningcat")
	fmt.Println(p.name)
	p.ChangrPersonName("world")
	fmt.Println(p.name)
}

func (x myInt) helloInt() {
	fmt.Printf("Hello %d\n", x)
}

func TestStruct8(t *testing.T) {
	var x myInt = 12
	x.helloInt()
}

func TestStruct9(t *testing.T) {
	var x int32 = 12
	var y = int32(12) // 另一种定义方法
	fmt.Println(x, y)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值