跟我一起学习GO语言007

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • fmt格式化字符串 格式:%[旗标][宽度][.精度][arg索引]动词旗标有以下几种:+: 对于数值类型总是输出...
    皮皮v阅读 1,089评论 0 3
  • Golang是我最喜欢的一门语言,它简洁、高效、易学习、开发效率高、还可以编译成机器码… 虽然它一出世,就饱受关注...
    盘木阅读 3,542评论 0 7
  • 一、数据类型转换 https://studygolang.com/articles/10838 package m...
    蓓蓓的万能男友阅读 1,054评论 0 1
  • 方法 Go语言中的方法其实就是一个特殊函数, 只不过这个函数是和某种属性类型绑定在一起的而已 Go语言中的方法一般...
    极客江南阅读 925评论 0 4
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,827评论 0 6