// 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")
}
}
// main.go
package main
import (
"fmt"
)
func main() {
x := "zhangsan"
for _, v := range x {
fmt.Printf("%c\n", v)
}
}
左函数右返回值中间若干传入参数
*传指针的值,&指针的地址
函数是一等公民,也可以作为值、类型
// 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)
}
函数作为具体的类型;变量指向具体的函数
/ 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))
}
// 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))
}
defer延迟的意思;后进先去
加入defer 的代码语句将会最后执行,同时也能保存defer后面的代码能够执行到
场景1:资源关闭
// defer.go
package main
import (
"fmt"
)
func main() {
for i := 1; i <= 5; i++ {
defer fmt.Println(i)
}
}
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后面得不到执行
}
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)
}
在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")
}
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。