美文网首页
跟我一起学习GO语言007

跟我一起学习GO语言007

作者: 搬砖人1314 | 来源:发表于2019-07-21 14:32 被阅读0次

    接上节,获得可变参数类型,可变参数为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")

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

    相关文章

      网友评论

          本文标题:跟我一起学习GO语言007

          本文链接:https://www.haomeiwen.com/subject/asapkctx.html