为了账号安全,请及时绑定邮箱和手机立即绑定

go语言初体验(流程控制、range遍历、函数、结构体、面向对象)

标签:
Go


一、流程控制

// 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")

    }

}

©著作权归作者所有:来自51CTO博客作者PowerMichael的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消