当前位置: 首页 > article >正文

golang中的函数和结构体

1.函数

1.1 函数的定义

//函数的定义
//func 函数名(参数)(返回值) {
//	函数体
//}


func sum(x,y int) int{
	return x+y
}
// 函数的使用
sum(1,2)

//函数之可变参数
func sum2(x ...int) int {
	sum := 0
	for _, num := range x {
		sum = sum + num
	}
	return sum
}
// 调用方法
sum2(1, 2, 3, 4, 5, 7)


//返回多个值

func cal(x,y int) (sum,sub int) {
	sum=x+y
	sub=x-y
	return 
}

1.2 方法作为参数

//定义函数类型
type fun1 func(int, int) int

func sum(x,y int) int {
	return x+y
}
func main()  {
	var fun fun1
	fun=sum
}

//方法作为参数

func sumFn(a,b int,sum func(int,int) int) int {
	return sum(a,b)
}

1.3匿名函数

//匿名函数的定义
//func (参数)(返回值) {
//	函数体
//}

func main() {
	func() {
		fmt.Println("hello,world")
	}()
}

1.4 defer 语句

        Go 语言中的defer 语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。

func main() {
	fmt.Println("1")
	defer fmt.Println("2")
	defer fmt.Println("3")
	fmt.Println("4")
}
//结果:[1,4,3,2]

return的执行逻辑,分为两部,一个是为返回值赋值,而是ret指令,而defer而是在这两个步骤中间执行。

7.6 panic/revocer处理异常

panic:可以在任何地方引发

recover:只有在defer调用函数内有效

func main() {
	defer func() {
		e := recover()
		if e != nil {
			fmt.Println("捕获异常")
		}
	}()
	err := isTrue(false)
	if err != nil {
		panic("出错了")
	}
}
func isTrue(flag bool) error {
	if flag {
		return nil
	} else {
		return errors.New("false")
	}
}

//捕获异常

2. golang中的函数

函数说明
close主要用来关闭channel
len用来求长度,string、array、slice、map、channel
new用来分配内存,分配值类型,比如int、结构体,返回的是指针
make用来分配内存,主要用于分配引用类型,比如chan、map、sclice
append用来追加元素到数组、slice
panic\recover处理异常
  • 两者都是用来做内存分配的
  • make只能用于slice、map以及channel的初始化,返回的还是这三个引用类型的本身
  • 而new用于类型的内存分配,并且内存赌赢的值为类型的零值,返回的是指向类型的指针
func main() {
	a := new(int)
	b := new(bool)
	fmt.Printf("%T \n", a)
	fmt.Printf("%T \n", b)
}
// *int *bool

3.type 关键词

在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。

type myInt int

func main() {
	var a myInt = 10
	fmt.Printf("%v %T", a, a)
}
//10 main.myInt

4. 结构体

4.1 结构体的定义

type Person struct {
	name string
	age  int
	sex  string
}

func main() {
	var person Person
	person.name = "张三"
	person.age = 20
	person.sex = "男"
	fmt.Printf("%#v", person)
}

        结构体首字母可以大写也可以小写,大写表示这个结构体是公有的,在其它的包里面也可以使用,小写表示结构体属于私有的,在其它地方不能使用。

4.2 结构体的实例化

func main() {
	//实例化1
	var person Person
	person.name = "张三"
	person.age = 20
	person.sex = "男"
	fmt.Printf("%#v", person)

	//实例化2
	var person2 = new(Person)
	person2.name = "李四"
	person2.age = 30
	person2.sex = "女"
	fmt.Printf("%#v", person2)

	//实例化3
	// 第三种方式实例化
	var person3 = &Person{}
	person3.name = "赵四"
	person3.age = 28
	person3.sex = "男"
	fmt.Printf("%#v", person3)

	//实例化4
	// 第四种方式初始化
	var person4 = Person{
		name: "张三",
		age:  10,
		sex:  "女",
	}
	fmt.Printf("%#v", person4)

	//实例化5
	// 第五种方式初始化
	var person5 = &Person{
		name: "孙五",
		age:  10,
		sex:  "女",
	}
	fmt.Printf("%#v", person5)

	//实例化6
	var person6 = Person{
		"张三",
		5,
		"女",
	}
	fmt.Println(person6)

}

4.3 结构体的继承


type Animal struct {
	name string
}
type Dog struct {
	Animal
	age int
}

func (dog Dog) getDog() {
	fmt.Println("狗")
}
func (animal Animal) getAnimal() {
	fmt.Println("动物")
}
func main() {
	var dog = Dog{
		age: 10,
		Animal: Animal{
			name: "小狗",
		},
	}
	dog.getDog()
	dog.getAnimal()
}

4.4 结构体的序列化与反序列化

4.4.1 Golang JSON序列化是指把结构体数据转化成JSON格式的字符串,Golang JSON的反序列化是指把JSON数据转化成Golang中的结构体对象。

        Golang中的序列化和反序列化主要通过“encoding/json”包

序列化

type Student struct {
	ID     string
	Gender string
	Name   string
	Sno    string
}

func main() {
	var s1 = Student{
		ID:     "12",
		Gender: "男",
		Name:   "李四",
		Sno:    "s001",
	}
	str, _ := json.Marshal(s1)
	fmt.Println(string(str))
}

  反序列化

type Student struct {
	ID     string
	Gender string
	Name   string
	Sno    string
}

func main() {
	var str = `{"ID":"12","Gender":"男","Name":"李四","Sno":"s001"}`
	var s2 = Student{}
	err := json.Unmarshal([]byte(str), &s2)
	if err != nil {
		fmt.Printf("转换失败 \n")
	} else {
		fmt.Printf("%#v \n", s2)
	}
}

注意

        我们想要实现结构体转换成字符串,必须保证结构体中的字段是公有的,也就是首字母必须是大写的,这样才能够实现结构体 到 Json字符串的转换。

4.4.2 结构体标签 tag

type Student struct {
	Id     string `json:"id"`
	Gender string `json:"gender"`
	Name   string `json:"name"`
	Sno    string `json:"sno"`
}

func main() {
	var s1 = Student{
		Id:     "12",
		Gender: "男",
		Name:   "李四",
		Sno:    "s001",
	}
	// 结构体转换成Json
	jsonByte, _ := json.Marshal(s1)
	jsonStr := string(jsonByte)
	fmt.Println(jsonStr)
	//{"id":"12","gender":"男","name":"李四","sno":"s001"}

	var str = `{"Id":"12","Gender":"男","Name":"李四","Sno":"s001"}`
	var s2 Student
	json.Unmarshal([]byte(str), &s2)
	fmt.Println(s2)
}


http://www.kler.cn/news/366059.html

相关文章:

  • 2024-网鼎杯第二次模拟练习-web02
  • 基于GPT的智能客服落地实践
  • Linux: network: wireshark IO图的一个问题
  • 鸿蒙实现相机拍照及相册选择照片
  • Java八股整合(Kafka+RocketMQ+K8S)
  • 基于LSTM-Transformer混合模型实现股票价格多变量时序预测(PyTorch版)
  • Android H5页面性能分析与优化策略
  • 头歌——人工智能(机器学习 --- 决策树2)
  • SpringSecurity 简单使用,实现登录认证,通过过滤器实现自定义异常处理
  • 从汇编角度看C/C++函数指针与函数的调用差异
  • 甘特图代做服务
  • 银河麒麟相关
  • 若依 spring boot +vue3 前后端分离
  • Java语言的充电桩系统-云快充协议1.5-1.6
  • 互联网系统的微观与宏观架构
  • 重构案例:将纯HTML/JS项目迁移到Webpack
  • Nginx、Tomcat等项目部署问题及解决方案详解
  • 从零开始:构建一个高效的开源管理系统——使用 React 和 Ruoyi-Vue-Plus 的实战指南
  • C++核心编程和桌面应用开发 第十五天(deque/stack/queue)
  • ubuntu 20.04修改DNS
  • 高并发场景下解决并发数据不一致
  • 自然语言处理:第五十五章 RAG应用 FastGPT 快速部署
  • pair类型应用举例
  • C++ 算法学习——1.3 Prim算法
  • python操作CSV和excel,如何来做?
  • <项目代码>YOLOv8煤矿输送带异物识别<目标检测>