go入门笔记 (3)

new

异常处理 //使用defer+recover 来捕获异常 defer func() { err := recover() //recover()内置函数,可以捕获到异常 if err != nil { //说明捕获到错误 fmt.Println("err=", err) } }() errors.New("错误说明") 会返回一个err类型的值表示一个错误 函数

go语言支持函数式编程+面向对象

函数:独立功能,直接调用

方法:对象的功能,对象来调用

可变参数: 参数名...

函数中,可变参数想当于切片

位置参数>可变参数 (顺序)

写返回值的时候,必须在函数上声明返回值的类型

函数式编程

一个函数可以作为另一个函数的参数或返回值

递归函数

自己调用自己

func getgui(n int) int{ if n==1||n==2{ return 1 } return getgui(n-1)+getgui(n-2) } 匿名函数 func(a,b int){ fmt.Println(a,b) }(1,2) 高阶函数(回调函数)

根据go语言函数的数据类型的特点,可以将函数作为另一个函数的参数

func add(a,b int) int{ return a+b } func oper(m,n int,fun func(int,int)int)int{ res:=fun(m,n) return res } func main() { fmt.Println( oper(10,20,add)) } 闭包

引用外部变量的匿名函数

支持将函数作为另一个函数的返回值

func f(i int) func() int{ return func() int{ i++ return i } } func main() { str:=f(10) fmt.Println(str()) fmt.Println(str()) } ----------------------------- func ExFunc(n int) func () { sum:=n a:=func(){ fmt.Println(sum+1) } return a } func main() { myFunc:=ExFunc(10) myFunc() } 函数的defer(延时机制)

在执行到defer是,暂时不执行,会将defer后面的压入独立的栈,按照先入后出的方式出栈,执行

先defer再return

获取变量的地址,用&

获取指针类型所指向的值*

fmt.Println(&num) var ptr *int=&num 值类型,都有对应的指针类型 新式为*数据类型 结构体 //定义一个类,就是定义一个结构体 //类的定义,字段属性,行为方法 type 结构体名称 struct{ name type age int } //定义结构体变量 var p1 结构体名称 p2:=Person{"mary",20} p6:=new(Person) var p1 Person p1.Age=10 p1.Name="小明" var p2 *Person=&p1 fmt.Println((*p2).Age) 注意不能*p2.Age写,因为.的优先级比* 高 // 实现结构体的浅拷贝 d4:=new(dog) d4.color="黄色" d4.age=2 d4.kind="中华田园犬" fmt.Println(d4) d5:=d4 d5.kind="张三" fmt.Println(d5,d4) d6:=&d1//*dog d6.kind="金毛" fmt.Println(d6,d1) //匿名结构体:没有名字的结构体,在创建匿名结构体,同时创建对象 p1:=struct { name string age int }{ name: "zhangsan", age: 30, } //匿名字段 type student struct{ string int//匿名字段(不能有重复字段) } s1:=student{"zhgsan",12} fmt.Println(s1.string,s1.int) type Book struct{ bookName string price float64 auther string } //嵌套struct的名称冲突 有以下两个名称冲突的规则(报错) * 外部struct覆盖内部struct的同名字段,同名方法(1) * 同级别的struct出现同名字段,方法将报错(2) type A struct{ a int b int } type B struct{ b int c string d string } type C struct { A //继承 B a string c string } (1) C.a和C.c分别覆盖A.a和B.c (2) A.b和B.b 为什么呢? 继承的"提升字段" //结构体嵌套 //模拟面向对象:聚合关系 //一个类作为另一个类的属性 //定义一个书的结构体 type Book struct{ bookName string price float64 auther string } //定义一个人的结构体 type Person struct{ name string age int book Book //聚合 } func main() { p3:=Person{ name:"Jerry", age:26, book:Book{ bookName:"Go语言是怎么练成的", price:55.0, auther:"张三", }, } fmt.Println(p3.book.auther,p3.book.price,p3.book.auther) p4:=Person{"李晓华",20,Book{"四万个为什么",44.8,"张三"}} fmt.Println(p4.book.auther,p4.book.price,p4.book.auther) }

struct 的数据类型:值类型:默认深拷贝

如果结构体的字段类型是:指针,slice,和map的零值都是nil,还没有分配空间

如果需要使用这样的字段 ,需要先make,才能使用

结构体是值类型

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwdwj.html