009.Go语言中的结构体

目录

1.结构体的定义与使用

2.结构体是值类型,通过指针修改结构体

3.匿名字段和匿名结构体

4.结构体嵌套

5.结构体跨包调用


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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值