目录
1.结构体的定义与使用
/*
结构体:
1.结构体名和属性名首字母大写是公共的,其他包可以访问到
2.结构体名和属性名首字母小写是私有的,其他包不能访问到
3.结构体是值类型的,未赋值的属性是各数据类型的默认值
4.定义格式:
type 结构体名称 struct{
属性名 数据类型
属性名 数据类型
...
}
*/
type User struct {
Name string
Age int
Addr string
money float64
}
func main() {
//1.声明结构体再赋值方式
var user1 User
user1.Name = "张三"
user1.Age = 23
user1.money = 12.34
user1.Addr = "山东"
fmt.Println(user1)
//2.简化定义方式
user2 := User{}
user2.Name = "李四"
user2.Age = 24
user2.Addr = "河南"
fmt.Println(user2)
//3.指定属性名直接赋值方式
user3 := User{
Name: "王五",
Age: 25,
money: 100}
fmt.Println(user3)
//4.不指定属性名赋值方式,需要跟属性位置对应,且全部赋值
user4 := User{"赵六", 26, "浙江", 123.45}
fmt.Println(user4)
}
2.结构体是值类型,通过指针修改结构体
type Person struct {
Name string
Age int
Gender string
Addr string
}
func main() {
//1.验证结构体是值类型的;变量赋值后,新老变量之间修改不会相互影响
person1 := Person{
Name: "张三",
Age: 23,
Gender: "男",
Addr: "北京"}
person2 := person1
fmt.Printf("person1:%v,内存地址:%p\n", person1, &person1)
fmt.Printf("person2:%v,内存地址:%p\n", person2, &person2)
person1.Name = "李四"
fmt.Printf("person1:%v,内存地址:%p\n", person1, &person1)
fmt.Printf("person2:%v,内存地址:%p\n", person2, &person2)
//2.通过指针使结构体实现引用类型的操作;变量赋值后,新老变量之间修改会相互影响
var person3 *Person = &person1
fmt.Printf("person1:%v,内存地址:%p\n", person1, &person1)
fmt.Printf("person3:%v,内存地址:%p\n", *person3, &person3)
//指针指向什么就是什么,所以此处可以通过指针变量名直接访问;正常格式:(*person3).Name = "王五"
person3.Name = "王五"
fmt.Printf("person1:%v,内存地址:%p\n", person1, &person1)
fmt.Printf("person3:%v,内存地址:%p\n", *person3, &person3)
//3.通过new的方式声明结构体,返回的是切片(指针),结构体操作就变为了引用类型
person4 := new(Person)
person4.Name = "赵六"
person4.Age = 26
person4.Gender = "男"
person4.Addr = "阿尔巴尼亚"
person5 := person4
fmt.Printf("person4:%v,数据类型:%T,内存地址:%p\n", *person4, person4, &person4)
fmt.Printf("person5:%v,数据类型:%T,内存地址:%p\n", *person5, person5, &person5)
person5.Addr = "阿尔及利亚"
fmt.Printf("person4:%v,数据类型:%T,内存地址:%p\n", *person4, person4, &person4)
fmt.Printf("person5:%v,数据类型:%T,内存地址:%p\n", *person5, person5, &person5)
}
3.匿名字段和匿名结构体
//1.匿名字段:字段类型不能重复
type Student struct {
string
int
}
func main() {
//1.匿名字段
stu1 := Student{"张三", 18}
fmt.Println(stu1)
//2.匿名结构体
stu2 := struct {
Name string
Age int
Gender string
}{
Name: "李四",
Age: 24,
Gender: "女"}
fmt.Println(stu2)
//3.匿名字段和匿名结构体
stu3 := struct {
string
int
bool
}{"王五", 18, true}
fmt.Println(stu3)
}
4.结构体嵌套
// 定义结构体
type Teacher struct {
Name string
Age int
Addr Address
}
// 定义子结构体
type Address struct {
Province string
City string
}
func main() {
//创建结构体
t := Teacher{
Name: "张三",
Age: 23,
Addr: Address{
Province: "山东",
City: "青岛",
},
}
fmt.Println(t)
}
5.结构体跨包调用
//1.创建一个pojo包,在pojo包下创建一个user.go文件,定义User结构体
package pojo
type User struct {
Name string
Age int
Gender string
Addr string
}
//2.创建一个main.go的主入口文件,导包调用User结构体
package main
import (
"fmt"
"goBaseTwo/struct/pojo" //导包路径从src目录下开始
)
func main() {
user := pojo.User{
Name: "张三",
Age: 23,
Gender: "男",
Addr: "浙江杭州",
}
fmt.Println(user)
}