结构体
定义结构体
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 // 能被导出使用该属性
}
- 总结:(抄的)
- 结构体大写字母能够导出。如果结构体名称首字母大写,则结构体可被导出,
- 结构体小写不能导出。 如果结构体名称首字母小写,则结构体不会被导出。