go 学习3

go学习


接口(interface)

知识点1:当一个类型定义了接口中的所有方法,该类型才实现了改接口。

知识点2:没有包含方法的接口称为空接口,用interface{}表示,因为没有方法,所有所有类型都实现了空接口

//如果一个函数接收空接口作为参数,
//那么这个函数可以传递任何类型
func a(i interface{}){
}

知识点3:类型断言
语法:i.(T),接口中 i 的具体类型是T

func a (i interface{}) {
    //如果传进来的值类型为int,那么v为该类型的值,ok为true
    //如果传进来的值类型不是int,那么v为0,ok为false
    v,ok := i.(int)
    fmt.Print(v)
}

知识点3:类型选择
语法:i.(type)

func a (i interface{}){
    switch i.(type){
        case string:
            fmt.Print(i) //这里输出传入的值
        case int:
            fmt.Print(i) //这里输出传入的值
        default:
            fmt.Print("找不到该类型")
    }
}
//case 后面还可以跟接口名称,可以判断传入的类型是否实现了该接口

知识点4:指针接受者和值接受者
如果接口实现方法的接受者是指针接受者,那么传入的值类型必须是带&的地址类型

知识点5:接口是可以嵌套的,可以调用子接口的方法。如果接口内的方法不存在,它的值和具体类型都为nil,并且调用它的时候会报错

序列化(struct)

序列化:就是把当前的数据格式转化为任何应用都能读取和输出的数据格式(比如json序列化 相当于PHP里面json_encode()方法
go序列化有三种格式:Json 、XML 、 Gob

Json序列化:需要import “encoding/json”
函数:json.Marshal(data)
反序列化函数:json.Unmarshal([]byte(str), &data)

go协程

Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。
使用:调用函数或者方法时,在前面加上关键字 go,可以让一个新的 Go 协程并发地运行。
注意:如果 Go 主协程终止,则程序终止,于是其他 Go 协程也不会继续运行。

信道

信道可以想像成 Go 协程之间通信的管道。如同管道中的水会从一端流到另一端,通过使用信道,数据也可以从一端发送,在另一端接收。
所有信道都关联了一个类型。信道只能运输这种类型的数据,而运输其他类型的数据都是非法的。
注意:发送和接收信道默认都是阻塞的,就是说单方面发送或接收都是阻塞的,发送后必须要接收,接收必须要有协程把数据写入信道,不然都会阻塞!

chan T表示T 类型的信道。

package main

import (
    "fmt"
)

func hello(done chan int) {
    fmt.Print("Hello chan方法")
    done <- 123 // 把123写入done信道
}
func main() {
    done := make(chan int) //  声明信道变量done
    go hello(done) //开启hello协程,并传入信道
    data := <- done  //读取信道done的值 并赋给data
    fmt.Print("data 的值为:",data)
}

chan int定义的都是双向信道,
go里还有单向信道:
chan <- int 唯送信道
<- chan int 唯收信道
双向信道可以转换成单向信道,单向信道不能转换成双向信道

猜你喜欢

转载自blog.csdn.net/qq_38083665/article/details/82190844