golang 结构体struct 08

本文详细介绍了Go语言中的结构体类型,包括普通结构体、双向链表和二叉树,并展示了如何创建、修改结构体以及使用指针。此外,还探讨了结构体方法的实现、tag在json格式化和反射中的应用。最后,通过示例演示了自定义类型的创建及操作。
摘要由CSDN通过智能技术生成

1.简单结构体

/*
普通结构体
*/
type Student struct {
	Name string
	Age int
	Score int
}

/*
双向链表
*/
type List struct {
	Name string
	Next* List
	Prev* List
}

/*
二叉树
*/
type Tree struct {
	Name string
	left* Tree
	right* Tree
}

2.创建

/*
make 用来创建map、slice、channel
new用来创建值类型
*/
func RunStruct()  {
	//结构体(传入其他函数,修改是不会同步到本身的)
	var stu1 Student
	//指针(可以对本身修改)
	var stu2 = new(Student)
	var stu3 = &Student{"name",66,100}

	stu1.Age =777
	fmt.Println(stu1,stu2,stu3)
	fmt.Println(stu3.Age)

	use(stu1,stu3)
	fmt.Println(stu1,stu3)

	tagRun()
}

func use(stu1 Student, stu3 *Student) {
	stu1.Age = 100
	stu3.Age = 1000
}

3.struct的方法

type Person struct {
	Name string 
	Age  int 
}

/*
struct的方法
名称
大写外部可访问
小写只有本包才能访问
*/
func (this Person) test() {
	fmt.Println(this.Age)
}

/*
实现 string方法,fmt.Println(m) 会自动输出这个
*/
func (m Person) String() string {
	return m.Name + "66666"
}

4.tag

/*
转成json的时候 后面的名字会替换前面的名称(前面必须大写,不然会被json格式化丢弃)
*/
type Person struct {
	Name string `json:"name"`
	Age  int `chinaL:"dabai"`
}

/*
struct的方法
名称
大写外部可访问
小写只有本包才能访问
*/
func (this Person) test() {
	fmt.Println(this.Age)
}

/*
实现 string方法,fmt.Println(m) 会自动输出这个
*/
func (m Person) String() string {
	return m.Name + "66666"
}

func tagRun() {
	person := Person { "tom", 12 }

	//json 格式化
	if b, err := json.Marshal(person); err != nil {
		fmt.Printf("error: %s", err.Error())
	} else {
		fmt.Printf("value: %s", b)
	}
	fmt.Println("")

	//反射获取值,获取我tag
	v := reflect.ValueOf(person)
	for i := 0; i < v.NumField(); i++ {
		fieldTag    := v.Type().Field(i).Tag
		fieldName   := v.Type().Field(i).Name
		fieldType   := v.Field(i).Type()
		fieldValue  := v.Field(i).Interface()
		fmt.Println("fieldTag: ",fieldTag)
		fmt.Println("fieldTag.value: ",fieldTag.Get("chinaL"))
		fmt.Println("fieldName: ",fieldName)
		fmt.Println("fieldType: ",fieldType)
		fmt.Println("fieldValue: ",fieldValue)
	}
	//这里是获取指针信息
	kk := 66.6
	fv := reflect.ValueOf(&kk)
	fv.Elem().SetFloat(3.3) //修改指针的变量
	fmt.Println("Elem: ",fv,kk)

	//调用结构体的方法
	person.test()
	fmt.Println(person)
}
/*
自定义类型
1.type integer int
2.type player struct
内存中是连续存储空间
*/
type userinfo struct {
	playerId string
	age      int16
	heig     int16
	hobby    []string
	morinfo  map[string]interface{}
}

type people struct {
	playerId string
	age      int16
	heig     int16
	hobby    []string
	morinfo  map[string]interface{}
}

func runUserinfo() {
	//1
	var cardInfo userinfo
	cardInfo.age = 1
	cardInfo.heig = 161
	cardInfo.hobby = []string{"ok", "1", "土豆"}
	cardInfo.morinfo = map[string]interface{}{"1": 2, "2": "aaaaa"}
	fmt.Println(cardInfo)

	//2
	cardInfo2 := userinfo{"66", 1, 5, []string{"1", "2"}, map[string]interface{}{"adsa": "asdsa"}}
	fmt.Printf("asdasd = %v\n", cardInfo2)

	//3 new 获取到的是指针
	var cardInfo3 *userinfo = new(userinfo)
	(*cardInfo3).playerId = "1111111111"
	(*cardInfo3).age = 66
	(*cardInfo3).morinfo = map[string]interface{}{"hahaha": "aaaaaa"}
	(*cardInfo3).hobby = []string{"1", "ttt", "uuu"}
	fmt.Println(cardInfo3)

	//4
	var cardInfo4 = &userinfo{
		playerId: "12313",
		age:      56,
		heig:     6,
		hobby:    nil,
		morinfo:  nil,
	}

	fmt.Println(cardInfo4)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值