day07 結構體

染指未来發表於2024-07-02

結構體

定義結構體

  • 儲存一組資料。 使用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 // 能被匯出使用該屬性
            }
- 總結:(抄的)
    - 結構體大寫字母能夠匯出。如果結構體名稱首字母大寫,則結構體可被匯出,
    - 結構體小寫不能匯出。 如果結構體名稱首字母小寫,則結構體不會被匯出。

相關文章