day07 结构体

结构体

定义结构体

  • 存储一组数据。 使用type声明结构体
package main

import "fmt"

type User struct {
	// 结构体 只 定义属性
	name string
	age  int
	sex  string
}

func main() {
	/*
		结构体:存储一组数据。 使用type声明结构体
	*/

	var user1 User
	fmt.Println("打印空结构体:", user1) // 打印空结构体: { 0 }

	// 给 结构体 对象赋值
	user1.name = "张三"
	user1.age = 18
	user1.sex = "男"
	fmt.Println("user1:", user1)

	// 获取结构体对象属性
	fmt.Println("user1的name:", user1.name)

	user2 := User{}
	user2.name = "李四"
	user2.age = 100
	user2.sex = "女"
	fmt.Println("user2:", user2)

	user3 := User{name: "王五", age: 22, sex: "男"}
	fmt.Println("user3:", user3)

	user4 := User{"赵六", 19, "女"}
	fmt.Println("user4:", user4)
}

指针结构体

  • 解决 同一个结构体变量修改问题
package main

import "fmt"

type User2 struct {
	name string
	age  int
	sex  string
}

func main() {
	/*结构体指针*/

	user := User2{"zs", 19, "man"}
	// 结构体类型:包.struct名
	fmt.Printf("user 结构体类型:%T 。地址:%p\n", user, &user) // user 结构体类型:main.User2 。地址:0xc00007a0c0

	// 结构体是值类型还是引用类型?
	user2 := user
	fmt.Println(user2)
	fmt.Printf("user2 结构体类型:%T 。地址:%p\n", user2, &user2) // user2 结构体类型:main.User2 。地址:0xc00007a120

	// 修改user2 不影响user
	user2.name = "zhaosi"
	fmt.Println(user)  // {zs 19 man}
	fmt.Println(user2) // {zhaosi 19 man}

	// 指针结构体,解决 同一个结构体变量修改问题
	var ptrUser *User2
	ptrUser = &user // 将定义的结构体对象。取地址赋值给指针变量
	fmt.Println("指针结构体 ptrUser:", ptrUser)
	fmt.Printf("指针结构体 ptrUser。类型:%T,内存地址:%p\n", ptrUser, &ptrUser) //指针结构体 ptrUser。类型:*main.User2,内存地址:0xc000058028
	ptrUser.name = "招商"
	fmt.Println(user)
	fmt.Println(ptrUser)

	// new 关键字创建指针类型变量。 new 创建指针变量
	ptrUser2 := new(User2)
	ptrUser2 = &user
	fmt.Println("ptrUser2:", ptrUser2)
	ptrUser2.name = "zzzzzz"
	fmt.Println("ptrUser2:", ptrUser2)
	fmt.Println("ptrUser2:", user)

}

匿名结构体

  • 匿名结构体.即:结构体没有名字
package main

import "fmt"

type Teacher struct {
	string
	int
}

func main() {
	/* 匿名结构体 */
	// 1. 匿名结构体.即:结构体没有名字

	anonymityStruct := struct {
		name string
		age  int
	}{"zs", 20}
	fmt.Println("打印匿名结构体:", anonymityStruct)
	fmt.Println("打印匿名结构体 name 属性:", anonymityStruct.name)

	// 2. 匿名结构体属性1
	anonymityStruct1 := struct {
		// 只能存在一种类型的 匿名属性
		string // 等同于  string string
		int
	}{"zhaosi", 30}
	fmt.Println("打印匿名结构体 anonymityStruct1 :", anonymityStruct1)
	fmt.Println("打印匿名结构体 anonymityStruct1 属性 string:", anonymityStruct1.string)
	fmt.Println("打印匿名结构体  anonymityStruct1 属性 int:", anonymityStruct1.int)

	// 3. 匿名结构体属性2
	anonymityStruct2 := Teacher{"gogogo", 300}
	fmt.Println("打印匿名结构体 anonymityStruct2:", anonymityStruct2)
	fmt.Println("打印匿名结构体 anonymityStruct2 属性 string:", anonymityStruct2.string)
	fmt.Println("打印匿名结构体  anonymityStruct2 属性 int:", anonymityStruct2.int)
}

结构体嵌套

  • 功能:能够实现复杂对象的定义
package main

import "fmt"

type Person struct {
	name    string
	age     int
	address Address
}
type Address struct {
	city, state string
}

func main() {
	/*
		结构体嵌套
			- 功能:能够实现复杂对象的定义
	*/
	person := Person{}
	person.name = "张三"
	person.age = 19
	person.address = Address{"北京", "昌平"}
	fmt.Println(person)
	fmt.Println(person.name)
	fmt.Println(person.age)
	fmt.Println(person.address.city)
	fmt.Println(person.address.state)
}

结构体导出

  • 结构体 导出 : 导包
- 结构体名称
    - 小写 : 不能被导出 type user struct{}
    - 大写 : 能被导出 type User struct{}
- 结构体内部的属性
    - 小写: 不能被导出
            type user struct{
                name string // 不能被导出使用该属性
            }
    - 大写: 能被导出
            type user struct{
                Name string // 能被导出使用该属性
            }
- 总结:(抄的)
    - 结构体大写字母能够导出。如果结构体名称首字母大写,则结构体可被导出,
    - 结构体小写不能导出。 如果结构体名称首字母小写,则结构体不会被导出。
posted @ 2024-07-02 01:02  染指未来  阅读(2)  评论(0编辑  收藏  举报