注 个人笔记,暂无做解释性介绍。
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
}