简单Demo

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
    "strconv"
)

func printBytes(s string) {
    fmt.Println("Bytes:", s)
    for i := 0; i < len(s); i++ {
        fmt.Printf("%x ", s[i])
    }
}
func printChars(s string) {
    fmt.Println("Chars: ", s)
    for i := 0; i < len(s); i++ {
        fmt.Printf("%c ", s[i])
    }
}

func test001() {
    const a int = 111
    fmt.Println(a)
    const b = "b"
    fmt.Println(b)
    const c = 'c'
    fmt.Println(c) // 99

    printBytes("迹忆客")
    printChars("迹忆客")
}

// 使用结构体

type Profile struct {
    name   string
    age    int
    gender string
    mother *Profile
    father *Profile
}

type company struct {
    name, addr string
}

type staff struct {
    name     string
    age      int
    gender   string
    position string
    company  // 匿名字段
}

func staffTest() {
    com := company{
        name: "阿里巴巴",
        addr: "杭州",
    }
    fmt.Println(com)
    s := staff{
        name:     "张三",
        age:      28,
        gender:   "男",
        position: "总经理",
        company:  com,
    }
    fmt.Println(s)
    fmt.Println(s.company.name)
    fmt.Println(s.company.addr)
}

// 绑定方法
// 以值做为方法接收者

func (p Profile) FmtProfile() {
    fmt.Println(p.name)
    fmt.Println(p.age)
    fmt.Println(p.gender)
}

// 以指针做为方法接收者
func (p *Profile) increase_age() {
    p.age += 1
}

func chanTest() {
    ch := make(chan int) // 创建channel
    go func() {
        ch <- 1 // 向channel中发送数据
    }()
    val := <-ch // 从channel中接收数据
    println(val)
}

func structTest001() {
    xm := Profile{
        name:   "小明",
        age:    19,
        gender: "男",
    }
    fmt.Println(xm)
    xm.FmtProfile()
    xm.increase_age()
    xm.FmtProfile()

    chanTest()
    staffTest()
}

func use_new_init_obj() {
    xm := new(Profile)
    fmt.Println(xm.name)
    fmt.Println(xm)
    xm.name = "iswbm"
    xm.age = 18
    xm.gender = "male"
    fmt.Println(xm)
}

func init_obj_2() {
    xm := &Profile{}
    xm.name = "老王"
    xm.age = 77
    xm.gender = "女"
    fmt.Println(xm)
}

type Phone interface {
    call()
}

type Nokia struct {
    name string
}

func (n Nokia) call() {
    fmt.Println("我是Nokia手机, 请开始通话。。。。")
}

//定义一个商品接口
//在 Go 语言中,是通过接口来实现的多态
type Good interface {
    settleAccount() int
    orderInfo() string
}

type Iphone struct {
    name     string
    quantity int
    price    int
}
type FreeGift struct {
    name     string
    quantity int
    price    int
}

func (phone Iphone) settleAccount() int {
    return phone.price * phone.quantity
}
func (phone Iphone) orderInfo() string {
    return "您要购买" + strconv.Itoa(phone.quantity) + "个" +
        phone.name + "计:" + strconv.Itoa(phone.settleAccount()) + "元"
}

func (gift FreeGift) settleAccount() int {
    return 0
}
func (gift FreeGift) orderInfo() string {
    return "您要购买" + strconv.Itoa(gift.quantity) + "个" +
        gift.name + "计:" + strconv.Itoa(gift.settleAccount()) + "元"
}

func calculateAllPrice(goods []Good) int {
    var allPrice int
    for _, good := range goods {
        fmt.Println(good.orderInfo())
        allPrice += good.settleAccount()
    }
    return allPrice
}

func useGood() {
    iphone := Iphone{
        name:     "Iphone",
        quantity: 1,
        price:    8000,
    }
    earphones := FreeGift{
        name:     "耳机",
        quantity: 1,
        price:    200,
    }
    goods := []Good{iphone, earphones}
    allPrice := calculateAllPrice(goods)
    fmt.Printf("该订单总共需要支付%d 元\n", allPrice)
}

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    Addr string `json:"addr,omitempty"`
}

func use_tag() {
    p1 := Person{
        Name: "Jack",
        Age:  28,
    }
    data1, err := json.Marshal(p1)
    if err != nil {
        panic(err)
    }
    //没有Addr不打印 {"name":"Jack","age":28}
    fmt.Printf("%s\n", data1)

    p2 := Person{
        Name: "json",
        Age:  16,
        Addr: "USA",
    }
    data2, err := json.Marshal(p2)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%s \n", data2)
}

func tag_use_reflect() {
    p := reflect.TypeOf(Person{})
    name, _ := p.FieldByName("Name")
    fmt.Printf("%q\n", name.Tag)

}

type PersonLabel struct {
    Name   string `label:"Name is: "`
    Age    int    `label:"Age is: "`
    Gender string `label:"Gender is: " default:"unknown"`
}

func Print(obj interface{}) error {
    v := reflect.ValueOf(obj)
    for i := 0; i < v.NumField(); i++ {
        //获取tag
        field := v.Type().Field(i)
        tag := field.Tag
        // 解析lable和default
        label := tag.Get("label")
        defaultValue := tag.Get("default")
        value := fmt.Sprintf("%v", v.Field(i))
        if value == "" {
            value = defaultValue
        }
        fmt.Println(label + value)
    }
    return nil
}

func use_tab_label() {
    p := PersonLabel{
        Name: "Alex",
        Age:  29,
    }
    Print(p)
}

func TypeAssertion() {
    var i interface{} = 10
    t1 := i.(int)
    fmt.Println(t1)

    // t2 := i.(string)
    // fmt.Println(t2)
    //panic: interface conversion: interface {} is int, not string
    t2, ok := i.(string)
    fmt.Println(t2, ok)
    fmt.Println("=====分隔线2=====")

    var k interface{} // nil
    t3, ok := k.(interface{})
    fmt.Println(t3, "3-", ok)

    fmt.Println("=====分隔线3=====")
    k = 10
    t4, ok := k.(interface{})
    fmt.Printf("t4  %d-%t\n", t4, ok)

    t5, ok := k.(int)
    fmt.Printf("t5 %d-%t\n", t5, ok)

}

func findType(i interface{}) {
    switch x := i.(type) {
    case int:
        fmt.Println(x, "is int...")
    case string:
        fmt.Println(x, "is string")
    case nil:
        fmt.Println(x, "is nil")
    default:
        fmt.Println(x, "not type matched.")
    }
}

/* 空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没有定义任何方法口,
也因此,我们可以说所有类型都至少实现了空接口
每一个接口都包含两个属性,一个是值,一个是类型。

而对于空接口来说,这两者都是 nil,可以使用 fmt 来验证一下*/

type empty_interface interface {
}

func use_empty_interface() {
    var i interface{}
    fmt.Printf("type %T, value:%v", i, i)

    //1.使用空接口接收任意类型的值

    i = 1
    fmt.Println(i)
    i = "hello"
    fmt.Println(i)
    i = false
    fmt.Println(i)
}

// 空接口: 函数接收任意类型的值,
func myPrint(i interface{}) {
    fmt.Println(i)
}

// 接收多个任意类型的值

func myList(values ...interface{}) {
    for _, value := range values {
        fmt.Println(value)
    }
}

// 定义一个可以接收任意类型的 array、slice、map、strcut

func anySlice() {
    any := make([]interface{}, 5)
    any[0] = 1
    any[1] = "hello world"
    any[2] = []int{1, 2, 3, 4}
    for _, value := range any {
        if value != nil {
            fmt.Println(value)
        }
    }

}
func main() {
    use_new_init_obj()
    init_obj_2()
    n := Nokia{name: "nokia"}
    n.call()
    useGood()
    use_tag()
    tag_use_reflect()
    use_tab_label()
    TypeAssertion()
    findType(10)
    findType("hello")
    var k interface{} // nil
    findType(k)
    findType(10.24)
    use_empty_interface()

    a := 10
    b := "hello"
    c := true
    myPrint(a)
    myPrint(b)
    myPrint(c)
    myList(a, b, c)
    anySlice()
}

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

推荐阅读更多精彩内容