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