Go语言中的结构体

Go语言结构体

  • struct里面可以包含多个字段(属性)
  • struct类型可以定义方法,注意和函数的区分
  • struct类型是值类型
  • struct类型可以嵌套
  • struct中的所有字段在内存是连续的
  • 结构体是用户单独定义的类型,不能和其他类型进行强制转换
  • struct没有构造函数,一般可以使用工厂模式来解决这个问题
    • 工厂模式也就是定义一个全局函数,传入一些参数,返回一个结构体
  • 结构体中字段可以没有名字,即匿名字段
    • 此时如果匿名字段是一个结构,即讲解实现了继承
  • struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化
package main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Name  string `json:"student_name"`
	Age   int    `json:"age"`
	Score int    `json:"score"`
}

func main() {
	var stu Student = Student{
		Name:  "stu01",
		Age:   18,
		Score: 80,
	}

	// 把这个结构体打包
	data, err := json.Marshal(stu)
	if err != nil {
		fmt.Println("json encode stu failed, err:", err)
		return
	}

	fmt.Println(string(data))
}

输出:(输出的字段变为tag字段了)
{“student_name”:“stu01”,“age”:18,“score”:80}

  • 初始化
var stu Student
var stu *Student = new (Student)
var stu *Student = &Student{}
type Student struct{
	Name string
	Age int
	score float32 //同样有大小写
}

func main()  {
	var stu Student

	stu.Age = 18
	stu.Name = "周杰伦"
	stu.score = 80

	var stu1 *Student = &Student{
		Age:20,
		Name:"林俊杰",
	}

	var stu2 =Student{
		Age:20,
		Name:"xxx",
	}

	fmt.Println(stu)
	fmt.Println(stu1)
	fmt.Println(stu2)
}
  • 方法:Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以
    有方法,而不仅仅是struct
    func (recevier type) methodName(参数列表)(返回值列表){}
type A struct {
        a int
}

func (t A) test() {        
	 fmt.Println(t.a)
}

var t A
t.test()
- 方法和函数的区别
	函数调用: function(variable, 参数列表)
	方法:variable.function(参数列表)
  • 如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个
    变量的String()进行输出。

  • 有一种特殊的struct{}类型的channel,他不能被写入任何数据,只有通过close()函数进行关闭操作,才能进行输出操作。struct类型的channel不占用任何内存,定义:

      var sig=make(chan struct{})
    
  • 使用空struct是对内存更友好的开发方式,在go源码中,针对空struct类型的内存申请补发,返回地址都是一个固定的地址,避免了内存滥用。一个用途是联合管道,实现并发等待。

package main

import (
	"fmt"
	"time"
)

func main03() {
	ch:=make(chan struct{})	//数据为空没有意义 通知作用
	go func() {
		time.Sleep(time.Second)
		fmt.Println("协程 完成")
		close(ch)
	}()
	fmt.Println("主函数执行")
	<-ch
	fmt.Println("主函数执行完成")
}

你可能感兴趣的:(Go,golang,开发语言,后端)