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
    	}
    
  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/pythonwl/p/14650537.html
Copyright © 2011-2022 走看看