跟我一起学习GO语言007

2019-07-21  本文已影响0人  搬砖人1314

接上节,获得可变参数类型,可变参数为interface{}类型时,可以传入任何类型的值。

func printTypeValue(slist ...interface{}) string {

    //字节缓冲作为快速字符串连接
    varb bytes.Buffer
    //遍历参数
    for_, s := range slist {
        //将interface{}类型格式化为字符串
        str := fmt.Sprintf("%v", s)
        //类型的字符串描述
        var type Stringstring

        //判读s类型
        switch s.(type) {
        casebool:
            typeString = "bool"
        casestring:
            typeString = "string"
        caseint:
            typeString = "int"
        }

        //写值字符串前缀
        b.WriteString("value:")
        //写入值
        b.WriteString(str)
        //写入类型前缀
        b.WriteString(" type:")
        //写入类型字符串
        b.WriteString(typeString)
        //添加换行符
        b.WriteString("\n")
    }
    return b.String()
}

    //将不同类型的变量通过printTypeValue()打印出来
    fmt.Println(printTypeValue(88,"one",false,99))

输出:
value:88 type: int
value:one type: string
value:false type: bool
value:99 type: int

多个可变参数函数中传递参数

//实际打印的函数
func rawPrint(rawList ...interface{}){
    for_, a:=range rawList{
        //打印参数
        fmt.Println(a)
    }
}

//打印函数封装
func print(slist ...interface{}){
    //将slist可变参数切片完整传递给下一个函数
    rawPrint(slist...)
}

//传输参数
    print(2,5,8)

Go语言中用defer语句会将其后面跟随的语句进行延迟处理

    fmt.Println("deferbegin")
    //将defer放入延迟调用栈
    defer fmt.Println(1)
    defer fmt.Println(2)
    //最后一个放入,位于栈顶,最新调用
    defer fmt.Println(3)
    fmt.Println("deferend")

输出:

defer begin
defer end
3 2 1

接下来我们看结构体(struct)

结构体的定义:
Type 类型名 struct{
字段1 字段1 类型
字段2 字段2 类型
….
}

    type Point struct{
        X int
        Y int
    }

    var p Point
    p.X=10
    p.Y=8

初始化结构体的成员变量,使用键值对赋值给结构体

type People struct{
        name string
        child*People
    }

    relation:=&People{
        name:"爷爷",
        child:&People{
            name:"爸爸",
            child:&People{
                name:"我",
            },
        },
    }

我们看看匿名结构体

//打印消息类型,传入匿名结构体

func printMsgType(msg * struct{
    id int
    data string
}){
    //使用动词%T打印msg的类型
    fmt.Println("%T\n",msg)
}

    //实例化一个匿名结构体
    msg:=&struct{
        id int
        data string
    }{
        1024,
        "long",
    }
    printMsgType(msg)

类型添加方法
//将int定义为MyInt类型

type MyInt int
//为MyInt添加IsZero()方法
func (m MyInt) IsZero() bool {
    return m == 0
}
//为MyInt添加Add()方法
func (m MyInt) Add(other int) int {
    return other + int(m)

}
    int f MyInt
    fmt.Println(f.IsZero())
    f = 1
    fmt.Println(f.Add(2))

类型内嵌和结构体内嵌

//基础颜色
type BasicColor struct {
R,G, B float32
}

type Color struct {
    //将基本颜色作为成员
    BasicBasic Color
    //透明度
    Alpha float32
}
    var cc Color
    //设置基本颜色分量
    cc.Basic.R = 1
    cc.Basic.G = 1
    cc.Basic.B = 0
    //设置透明度
    cc.Alpha = 1
    //显示整个结构体内容
    fmt.Printf("%+v", cc)

接下来我们来看看接口,前面我们代码中已经含有了,接口就是双方约定的一种合作协议。

Type接口类型名 interface{
方法名1 (参数列表1) 返回值列表1
方法名2(参数列表2) 返回值列表2

}

//定义一个数据写入器
type DataWriter interface {
    WriteData(data interface{}) error
}
//定义文件结构,用于实现DataWriter
type file struct {

}
//实现DataWriter接口的WriteData()方法
func (d *file) WriteData(data interface{}) error {
    //模拟写入数据
    fmt.Println("WriteData:", data)
    return nil

}

    //实例化file
    fa := new(file)
    //声明一个DataWriter的接口
    var writer DataWriter
    //将接口赋值fa,也就是*file类型
    writer = fa
    //使用DataWriter接口进行数据写入
    writer.WriteData("data")

多个类型可以实现相同的接口

//一个服务器需要满足能够开启和写日志的功能
type Service interface {
    Start() //开启服务
    Log(string) //日志输出
}
//日志器
type Logger struct{}
//实现Service的Log()方法
func (g *Logger) Log(l string) {

}
//游戏服务
type GameService struct {
    Logger
}
//实现Service的Start()方法
func (g*GameService) Start() {

}
    varsa Service = new(GameService)
    sa.Start()
    sa.Log("hai")

请开始你的表演,践行,践行,再践行。未完待续。。。

上一篇下一篇

猜你喜欢

热点阅读