内容简介:左函数右返回值中间若干传入参数*传指针的值,&指针的地址函数是一等公民,也可以作为值、类型
一、流程控制
// main package main import ( "fmt" ) func main() { x := 2 switch x { case 1: fmt.Print("beifeng 1") case 2: fallthrough case 3: fmt.Print("beifeng 2") default: fmt.Print("beifeng 3") } }
二、range遍历
// main.go package main import ( "fmt" ) func main() { x := "zhangsan" for _, v := range x { fmt.Printf("%c\n", v) } }
三、函数
左函数右返回值中间若干传入参数
*传指针的值,&指针的地址
函数是一等公民,也可以作为值、类型
3.1 函数传值与传指针
// func_1 package main import ( "fmt" ) func swap(a, b int) (int, int) { return b, a } func add(a *int) *int { *a = *a + 1 return a } func main() { a := 1 add(&a) fmt.Printf("%d", a) }
3.2 匿名函数
函数作为具体的类型;变量指向具体的函数
/ main.go package main import ( "fmt" ) func main() { type sum func(x, y int) int var f sum = func(x, y int) int { return x + y } fmt.Println(f(3, 4)) }
3.3 函数中传入切片参数
// fun_2 package main import ( "fmt" ) //求和函数,传入一个动态整型数组 func getSum(num []int) int { //初始化sum变量 sum := 0 //遍历数组,求和 for i := 0; i < len(num); i++ { sum += num[i] } //返回sum值 return sum } func main() { //初始化num整型切片变量 num := []int{1, 2, 3, 4, 5} fmt.Print(getSum(num)) }
3.4 defer函数
defer延迟的意思;后进先去
加入defer 的代码语句将会最后执行,同时也能保存defer后面的代码能够执行到
场景1:资源关闭
// defer.go package main import ( "fmt" ) func main() { for i := 1; i <= 5; i++ { defer fmt.Println(i) } }
3.5 pannic
Go的异常处理机制
Panic 捕获异常,程序挂
// panic.go package main import ( "fmt" ) func main() { defer func() { fmt.Println("After panic from defer !") //panic之后 defer里面的依然可以得到执行 }() panic("I am panicing!") fmt.Println("After panic!") //panic后面得不到执行 }
四、结构体struct
Go语言没有private、protected、public这样的关键字。
某个符号对其他包(package)可见(即可以访问),
需要将该符号定义为以大写字母开头。
// main.go package main import ( "fmt" ) type Person struct { name string age int } type Student struct { Person age int speciality string } func main() { student := Student{Person{"zhangsan", 25}, 30, "maths"} fmt.Printf("%v %v", student.Person.age, student.age) }
五、面向对象
类与方法
Golang:"A method is a function with an implicit first argument, called a receiver.“
func (r ReceiverType) funcName(parameters) (results)
类型和作用在它上面定义的方法必须在同一个包里定义,这就是为什么不能在 int、float 或类似这些的类型上定义方法。
类的初始化:point :=new(Point)
point :=&Point{}
point :=&Point{x:100, y:100}
point := Point{}
// main package main import ( "fmt" ) /*func compare(a, b int) bool { return a < b }*/ //定义一个结构体Point type Point struct { px float32 py float32 } //接收者point,接收类型结构体指针Point,方法setXY(),传入参数px,py func (point *Point) setXY(px, py float32) { //定义接收者属性 point.px = px point.py = py } //接收者point 接收类型结构体指针Point,方法getxy(),返回两个float32数据类型的值 func (point *Point) getXY() (float32, float32) { //返回x,y值 return point.px, point.py } //定义一个结构体 Integer type Integer struct { //定义结构体的属性 value int } func main() { //初始化一个类 point := new(Point) point.setXY(1.23, 4.56) px, py := point.getXY() fmt.Print(px, py) }
5.1 面向对象之继承、接口、接口赋值、any类型、类型查询
在 Go 语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口。
接口赋值有两种方式:1、将对象实例赋值给接口;2、将一个接口赋值给另一个接口
Go语言中任何对象实例都满足空接口interface{},interface{}可以接收所有数据类型
package main import "fmt" //定义一个Person结构体 type Person struct { name string age int } //接收者person,接收结构体类型Person, 方法getNameAndAge() 返回string,int值 func (person Person) getNameAndAge() (string, int) { return person.name, person.age } type Student struct { Person speciality string } func (student Student) getSpeciality() string { return student.speciality } //定义一个Animal接口,实现的方法有Fly() Run() type Animal interface { Fly() Run() } type Animal2 interface { Fly() } type Bird struct { } //通过接收者实现接口的方法 //接收者bird实现Fly()方法 func (bird Bird) Fly() { fmt.Println("Bird is flying!!!!") } //接收者bird实现Run()方法 func (bird Bird) Run() { fmt.Println("Bird is running!!!!") } func main() { student := new(Student) student.name = "zhangsan" student.age = 26 name, age := student.getNameAndAge() student.speciality = "computer" speciality := student.getSpeciality() fmt.Println(name, age, speciality) //定义animal接口 var animal Animal //定义animal2接口 var animal2 Animal2 //初始化一个对象bird bird := new(Bird) //将对象实例bird赋值给animal接口 animal = bird //将animal接口赋值给animal2接口 animal2 = animal // //animal = bird //把类实例直接赋值给接口 //animal2 = bird animal2.Fly() animal2.Fly() animal.Fly() animal.Run() //定义一个any类型的变量v1 var v1 interface{} //赋值 v1 = "zhangsan" switch v1.(type) { case int: case float32: case float64: fmt.Println("this is float64") case string: fmt.Println("this is string") } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Go 语言函数式编程系列(十二) —— 数据类型篇:字典类型的遍历与排序
- Go 语言函数式编程系列教程(九) —— 数据类型篇:数组切片的创建和遍历
- 数组常见的遍历循环方法、数组的循环遍历的效率对比
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除
- Js遍历数组总结
- 遍历
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML5秘籍(第2版)
[美] Matthew MacDonald / 李松峰、朱巍、刘帅 / 人民邮电出版社 / 2015-4 / 89.00元
不依赖插件添加音频和视频,构建适用于所有浏览器的播放页面。 用Canvas创建吸引人的视觉效果,绘制图形、图像、文本,播放动画,运行交互游戏。 用CSS3将页面变活泼,比如添加新奇的字体,利用变换和动画添加吸引人的效果。 设计更出色的Web表单,利用HTML5新增的表单元素更加高效地收集访客信息。 一次开发,多平台运行,实现响应式设计,创建适配桌面计算机、平板电脑和智能手机......一起来看看 《HTML5秘籍(第2版)》 这本书的介绍吧!