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

栏目: Go · 发布时间: 6年前

内容简介:左函数右返回值中间若干传入参数*传指针的值,&指针的地址函数是一等公民,也可以作为值、类型

一、流程控制

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Neural Networks for Applied Sciences and Engineering

Neural Networks for Applied Sciences and Engineering

Samarasinghe, Sandhya / CRC Pr I Llc / 2006-9 / $ 118.59

In response to the exponentially increasing need to analyze vast amounts of data, Neural Networks for Applied Sciences and Engineering: From Fundamentals to Complex Pattern Recognition provides scient......一起来看看 《Neural Networks for Applied Sciences and Engineering》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具