zoukankan      html  css  js  c++  java
  • Golang基础——数据类型:接口

    接口

    type Tea struct {
    	name string
    	age  int
    }
    type Stu struct {
    	Tea   // 匿名字段,为Tea类型,继承了Tea
    	score int
    }
    
    func (s Stu) jiao() { // 值传递
    	s.score = 11111
    	fmt.Println(s.score)
    }
    
    func (s *Stu) jiao2() { // 指针传递
    	s.score = 22222
    	fmt.Println(s.score)
    }
    
    type ser interface { // 接口:规定要实现的方法,对象必须实现了规定的方法,才能赋值给接口
    	jiao()
    	jiao2() // 指针类型方法,要把对象地址赋值给接口
    }
    
    func main() {
    	s := Stu{Tea{"aaa", 11}, 100}
    	var ser1 ser
    	ser1 = &s
    	fmt.Println(ser1)
    }
    

    多态

    type Tea struct {
    	name string
    	age  int
    }
    type Stu struct {
    	Tea   // 匿名字段,为Tea类型,继承了Tea
    	score int
    }
    
    func (s *Stu) jiao2() { // 指针传递
    	fmt.Println("sjiao2")
    }
    func (t *Tea) jiao2() {
    	fmt.Println("tjiao2")
    }
    
    type ser interface {
    	jiao2()
    }
    
    func sayhello(s ser) {
    	s.jiao2()
    }
    
    func (t Tea) jiao() int {
    	return 1
    }
    
    type ser2 interface { // 子集
    	// jiao() // jioa 有返回值,这样不行
    	jiao() int // jiao的类型为:jiao() int
    }
    
    func (t Tea) sing() {
    	fmt.Println("sing")
    }
    
    type ser3 interface { // 超集
    	ser2
    	sing()
    }
    
    func main() {
        // 同种调用方式,用于不同的对象,实现多态
    	s := Stu{Tea{"aaa", 11}, 100}
    	t := Tea{"bbb", 22}
    	sayhello(&s)
    	sayhello(&t)
    }
    

    接口之间的赋值:超集与子集

    type Tea struct {
    	name string
    	age  int
    }
    type Stu struct {
    	Tea   // 匿名字段,为Tea类型,继承了Tea
    	score int
    }
    
    func (s *Stu) jiao2() { // 指针传递
    	fmt.Println("sjiao2")
    }
    func (t *Tea) jiao2() {
    	fmt.Println("tjiao2")
    }
    
    type ser interface {
    	jiao2()
    }
    
    func sayhello(s ser) {
    	s.jiao2()
    }
    
    func (t Tea) jiao() int {
    	return 1
    }
    
    type ser2 interface { // 子集
    	// jiao() // jioa 有返回值,这样不行
    	jiao() int // jiao的类型为:jiao() int
    }
    
    func (t Tea) sing() {
    	fmt.Println("sing")
    }
    
    type ser3 interface { // 超集
    	ser2
    	sing()
    }
    
    func main() {
        // 子集包含于超集,所以,子集不能赋值给超集
        // 因为子集方法少,不包含超集中的其他方法,所以,不能赋值给超集
        // 超集方法包含所有的子集方法,故能赋值给子集
    	t2 := Tea{"ccc", 33}
    	var sinter ser2
    	sinter = t2
    	fmt.Println(sinter)
    	var sinter2 ser3
    	sinter2 = t2
    	fmt.Println(sinter2)
    	sinter = sinter2
    	// sinter2 = sinter  // 不行
    }
    
    

    空接口:可以接收任意类型的值

    func main() {
    	var c interface{} // 空接口可以接受任意类型的数据
    	c = 111
    	fmt.Println(c)
    }
    

    判断一个变量的类型:类型断言和switch测试

    	// 类型断言
    	var i interface{}
    	i = 10
    	v, ok := i.(int)
    	fmt.Println(v, ok) // 10 true
    	// 紧接着运行下一行报错:运行了之前的代码:v 已经是整型了,所以报错
    	// v, ok = i.(string)  // cannot assign string to v (type int) in multiple assignment
    	k, ok := i.(string)
    	fmt.Println(k, ok) // 空字符串 false
    
    	// switch测试
    	var l []interface{}
    	l = append(l, 1, "aaa", 'c')
    	for _, v := range l {
    		switch value := v.(type) {
    		case int:
    			fmt.Println("int", value)
    		case string:
    			fmt.Println("string", value)
    		default:
    			fmt.Println("不匹配", value)
    		}
    		// var kk interface{}
    		// fmt.Println(kk.(type))  // use of .(type) outside type switch
    	}
    
  • 相关阅读:
    腾讯QQ服务器汇总表 及禁用QQ方法
    C#下一个SQL SERVER数据库操作类
    获取页面运行时间以及数据库查询次数
    GridView导出Excel
    使用FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
    JS图片loading及放大查看效果(兼容IE,FF)
    .NET 开发人员十个必备工具
    jsp日期时间格式化输出
    MyEclipse6.5与Perforce的集成
    [转]firefox与IE的nextSibling
  • 原文地址:https://www.cnblogs.com/pythonwl/p/14650537.html
Copyright © 2011-2022 走看看