结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
type 类型名 struct {
字段名1 字段1的数据类型
字段名2 字段2的数据类型
...
}
定义一个Person的结构体
type Person struct {
name string
sex int8
age int8
}
相同数据类型也可以写同一行
type person struct {
name string
sex,age int8
}
只有当结构体实例化时,才会真正地分配内存,即实例化后才能使用结构体的字段。
var 结构体实例 结构体类型
先实例化,再赋值
var p1 Person
p1.name = "张三"
p1.sex = 0
p1.age = 20
实例化同时赋值
p2 := Person{
name: "李四",
sex: 1,
age: 18,
}
var user struct{Name string; Age int}
user.Name = "test"
user.Age = 18
struct
是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。定义结构体
type Person struct {
name string
sex, age int8
}
构造函数
/**
* @Description: Person的构造函数
* @param name 姓名
* @param sex 性别
* @param age 年龄
* @return *Person 结构体指针
*/
func newPerson(name string, sex, age int8) *Person {
return &Person{
name: name,
sex: sex,
age: age,
}
}
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
// 定义结构体
type Person struct {
name string
sex, age int8
}
// 绑定方法
func (p Person) Say() {
fmt.Println(p.name + "你好")
}
// 调用
p1 := Person{
name: "李四",
sex: 1,
age: 18,
}
p1.Say()
func (p *Person) Say2() {
fmt.Println(p.name + "你好")
}
p1 := Person{
name: "李四",
sex: 1,
age: 18,
}
(&p1).Say2()
参考资料:https://blog.csdn.net/leo_jk/article/details/118438213
通过嵌套结构体实现继承
// Person 定义结构体
type Person struct {
name string
sex, age int8
//嵌套匿名结构体
Student
//嵌套结构体
//Student Student
}
// Student 定义被嵌套的结构体
type Student struct {
School string `json:"schoolName"`
//通过指定tag实现json序列化该字段时的key
Id string `json:"student"`
}
// Say 使用指针类型的接收者为Person结构体创建一个方法
func (p *Person) Say() {
fmt.Println(p.name + "你好")
}
// printSchool 使用指针类型的接收者Student结构体创建一个方法
func (s Student) printSchool() {
fmt.Println("欢迎来到" + s.School)
}
func main() {
// 实例化一个结构体
p1 := Person{
name: "李四",
sex: 1,
age: 18,
Student: Student{
Id: "123456",
School: "西安交通大学",
},
}
data, err := json.Marshal(p1)
if err != nil {
fmt.Println("json marshal failed!")
return
}
fmt.Printf("json str:%s\n", data)
// 调用自己的方法
p1.Say()
// 调用继承Student结构体的方法
p1.printSchool()
}
type Square struct {
sideLen float32
}
type Triangle struct {
Bottom float32
Height float32
}
func (s *Square) Area() {
fmt.Println("正方形面积计算")
}
func (t *Triangle) Area() {
fmt.Println("三角形面积计算")
}
func main() {
t := Triangle{
Bottom: 15,
Height: 20,
}
s := Square{
sideLen: 10
}
//计算面积
t.Area()
s.Area()
}