Go语言简易的面向对象之结构体和从此突破指针

本文详细介绍了Go语言中的面向对象特性,包括结构体的定义、初始化、指针使用以及结构体转换。同时,展示了如何将结构体转换为JSON格式的字符串,以及结构体字段的指定命名。此外,还讨论了结构体内存布局和指针的深层次理解。
摘要由CSDN通过智能技术生成

go的面向对象

结构体定义

type 结构体名称 struct{
field1 type
field2 type
}
结构体名称若为大写,则其他包也能引用该结构体

指针,slice,map的零值都为nil,
slice和map使用前必须make

结构体的声明(4种方式)

  1. var student1 Student
  2. var student2 Student = Student{
    “李威彤”,20,
    }
  3. var student3 *Student = new(Student)
  4. var student4 *Student = &Student{“tom”,11}
package main
import(
	"fmt"
)

func main(){
	// 1
	var student1 Student
	student1.Name="李威彤1"
	student1.Age=22
	fmt.Println(student1)

	// 2
	var student2 Student = Student{
		"李威彤",20,
	}
	fmt.Println(student2)

	// 3 返回的是结构体指针,go作简化后,支持结构体指针.字段名,原本其实是(*结构体指针).属性
	var student3 *Student = new(Student)
	// (*student3).Name = "郑敏艺"
	// (*student3).Age = 21
	student3.Name = "郑敏艺"
	student3.Age = 21
	fmt.Println(*student3) // 这里的星号不加会出现取地址符号

	// 4 返回的是结构体指针,go作简化后,支持结构体指针.字段名,原本其实是(*结构体指针).属性
	var student4 *Student = &Student{"tom",11}
	fmt.Println(*student4)
}

type Student struct{
	Name string
	Age int
}

结构体强转

	var student1 Stu
	var student2 Student
	// student1的数据类型是Stu,Stu只是Student的别名,这两者golang不等价!
	student2 = Student(student1) // 必须强转
	fmt.Println(student1,student2)
}
type Student struct{
	Name string
}
type Stu Student // 给Student自定义数据类型起别名
	var i integer = 10 // integer只是int的别名,并不等价
	var j int = 20
	j = int(i)
	fmt.Println(i,j)
}
// 第二个实例:结构体强转
type integer int

结构体转json格式的字符串,返回给前端以便处理和分离

package main

import(
	"fmt"
	"encoding/json"
)

func main(){
	monster1 := Monster{"李威彤",21}
	fmt.Println(monster1)

	jsonString,_:=json.Marshal(monster1)

	// 实际场景,字段首字母为小写。如何解决,字段使用标签``,即反射机制
	fmt.Println("服务端将会收到json格式的字符串=>",string(jsonString))
// 服务端将会收到json格式的字符串=> {"name":"李威彤"}
}

type Monster struct{
	Name string `json:"name"` // 返回的json格式的字符串中的首字母小写name
	age int `json:"age"`
}

声明结构体指定字段名

var stu5 *Stu= &Stu{"小李",22} // stu -> 地址 -> 结构体数据

	// 1 不可颠倒顺序
	var stu1 = Stu{"小明",19}
	stu2:=Stu{"小明~",20}

	// 2 不依赖顺序
	var stu3 = Stu{
		Name:"jack",
		Age:20,
	}

	stu4:=Stu{
		Age:30,
		Name:"mary",
	}
	fmt.Println(stu1)
	fmt.Println(stu2)
	fmt.Println(stu3)
	fmt.Println(stu4)

	// 3 将结构体的指针返回给一个变量.返回结构体的指针类型!
	var stu5 *Stu= &Stu{"小李",22} // stu -> 地址 -> 结构体数据
	stu6 := &Stu{"小李~",23}
	fmt.Println(*stu5)
	fmt.Println(*stu6)

	// 4 
	var stu7 = &Stu{
		Name : "小郑",
		Age:20,
	}

	stu8 := &Stu{
		Name : "小郑~",
		Age:21,
	}
	fmt.Println(*stu7)
	fmt.Println(*stu8) // 不加*有&
}

type Stu struct{
	Name string
	Age int
}

突破!结构体内存图

p2这个指针所指的值为一个地址!p2本身也拥有一个地址,但也仅仅是仅限于用&p2打印出来看看罢了,p2的值(地址)就是p1的地址值(&p1),p1的值那自然就是一个对象拥有的属性元素啦!
在这里插入图片描述

{
	var person Person
	person.Age = 1
	var p2 *Person = &person
	fmt.Println((*p2).Age)
	fmt.Println(p2.Age) // 等同如上
	// 就是不能fmt.Println(*p2.Age)
}
type Person struct{
	Name string
	Age int
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值