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)
}