package main
import "fmt"
type Course struct {
    name  string
    price int
    url   string
}
type Printer interface {
    printInfo() string
}
func (c Course) printInfo() string {
    return "课程信息"
}
//func print(x interface{}){
//    if v, ok := x.(int); ok{
//        fmt.Printf("%d(整数)\n", v)
//    }
//    if s, ok := x.(string); ok {
//        fmt.Printf("%s(字符串)\n", s)
//    }
//    //牵扯到go的另一个默认的问题
//    //fmt.Printf("%v\n", i)
//}
type AliOss struct {
}
type LocalFile struct {
}
func store(x interface{}) {
    switch v := x.(type) {
    case AliOss:
        //此处要做一些特殊的处理,我设置阿里云的权限问题
        fmt.Println(v)
    case LocalFile:
        //检查路径的权限
        fmt.Println(v)
    }
}
//判断类型
func print(x interface{}) {
    switch v := x.(type) {
    case string:
        fmt.Printf("%s(字符串)\n", v)
    case int:
        fmt.Printf("%d(整数)\n", v)
    }
}
func main() {
    //空接口
    var i interface{} //空接口
    //空接口可以类似于我们java和python中的object,等于下面的代码
    //type Printer interface {
    //}
    //i = Course{}
    //fmt.Println(i)
    i = 10
    print(i)
    i = "bobby"
    print(i)
    i = []string{"django", "scrapy"}
    print(i)
    //空接口的第一个用途 可以把任何类型都赋值给空接口变量
    //2. 参数传递
    //3. 空接口可以作为map的值
    var teacherInfo = make(map[string]interface{})
    teacherInfo["name"] = "bobby"
    teacherInfo["age"] = 18
    teacherInfo["weight"] = 75.2
    teacherInfo["courses"] = []string{"django", "scrapy", "sanic"}
    fmt.Printf("%v", teacherInfo)
    //类型断言
    //接口的一个坑, 接口引入了
    // 接口有一个默认的规范  接口的名称一般以 er结尾
    //c := &Course{}
    //var c Printer = Course{}
    //c.printInfo()
}