【Go】结构体

个人笔记,暂无做解释性介绍。

1 结构体基本内容

package main

import "fmt"

/**
结构存储不同类型的数据
 */


func main(){
	// 1.创建结构体
	// 方法1
	var p1 Person
	fmt.Println(p1)
	// 通过.操作访问结构体的属性
	p1.name = "菊子皮"
	p1.age = 26
	p1.sex = "male"
	p1.address = "江苏南京"
	fmt.Printf("姓名:%s,年龄:%d,性别:%s, 地址:%s\n",p1.name, p1.age, p1.sex, p1.address)
	// 方法2
	p2 := Person{}
	p2.name = "xiaojuzi"
	p2.age = 18
	p2.sex = "female"
	p2.address = "江苏南京"
	fmt.Printf("姓名:%s,年龄:%d,性别:%s, 地址:%s\n",p2.name, p2.age, p2.sex, p2.address)
	// 方法3
	p3 := Person{
		name:"xiaoPiPi",
		age:0,
		sex:"male",
		address:"江苏南京",
	}
	fmt.Printf("姓名:%s,年龄:%d,性别:%s, 地址:%s\n",p3.name, p3.age, p3.sex, p3.address)
	// 方法4,注意顺序
	p4 := Person{"go", 20,"male or famale", "google"}
	fmt.Println(p4)
	// 2.结构体指针
	// 以p4为例
	fmt.Printf("结构体地址:%p,结构体类型:%T\n", &p4, p4)
	p5 := p4   // 本质上是将p4复制给p5
	fmt.Print(p5)
	fmt.Printf("%p,%T\n", &p5, p5)
	p5.name = "modify"
	fmt.Println(p4)
	fmt.Println(p5)
	// 2.1 定义结构体指针
	var pp1 *Person
	pp1 = &p4
	fmt.Println(pp1)
	fmt.Printf("%p, %T\n", pp1, pp1)
	// 使用*加结构体变量名获取结构体的值
	fmt.Println(*pp1)
	// (*pp1).name ==> pp1.name获取值
	fmt.Println(pp1.name)
	// 通过指针修改结构体的值
	pp1.name = "Python"
	fmt.Println(p4)
	fmt.Println(pp1)
	// 2.2 使用内置函数new(),go语言中专门用于创建某种类型的指针的函数
	pp2 := new(Person)
	fmt.Printf("%T\n", pp2)
	fmt.Println(pp2)
	pp2.name = "C++"  // 为结构体数据设置属性
	fmt.Println(pp2)
	// 补充:new 可以创建任意类型的指针,不是空指针,而是各种类型的默认值
	pp3:=new(int)
	fmt.Printf("%T", pp3)
	fmt.Println("\n-----------------")
	// 3.匿名结构体和匿名字段
	// 普通结构体
	s1 := Student{name:"pipi", age:18}
	fmt.Println(s1.name, s1.age)
	// 匿名结构体
	s2 := struct {
		name string
		age int
	}{name:"python", age:30}
	fmt.Println(s2.name, s2.age)
	// 匿名字段,将数据类型作为字段名称(匿名字段不能重复)
	worker := Worker{"python", 40}
	fmt.Println(worker.string, worker.int)
	fmt.Println("-----------------")
	// 4.嵌套结构体,一个结构体字段是另一个结构体
	// 创建数的对象
	b1 := Book{}
	b1.bookName = "统计学习方法"
	b1.price = 68.9
	ns1 := NewStudent{}
	ns1.name = "pipi"
	ns1.age = 18
	ns1.book = b1  // 注:值传递
	fmt.Println(b1)
	fmt.Println(ns1)
	fmt.Printf("学生姓名:%s,年龄:%d,看的书是:《%s》,书的价格是:%.2f",
		ns1.name, ns1.age, ns1.book.bookName, ns1.book.price)
	// 简写的结构体类型
	ns2 := NewStudent{
		name:"jack",
		age:18,
		book:Book{bookName:"花书", price:150.9},
	}
	fmt.Println(ns2.name, ns2.age)
	fmt.Println("\t", ns2.book.bookName, ns2.book.price)

}
type Book struct {
	bookName string
	price float64
}
type AdvanceStudent struct {
	name string
	age int
	book *Book  // book的地址,当源book的值改变时,student中的book也会随之改变
}
type NewStudent struct {
	name string
	age int
	book Book
}
type Worker struct {
	// 匿名字段
	string
	int
}
type Student struct {
	name string
	age int
}
// 定义结构体 变量首字母大小,则改变量供有,小写为私有
type Person struct {
	name string
	age int
	sex string
	address string
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

智绘山河

你的鼓励可能解决你下一个问题

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

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

打赏作者

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

抵扣说明:

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

余额充值