zoukankan      html  css  js  c++  java
  • Go 其七 空接口与断言

    空接口与断言

    1. 空接口可以表示任何类型
    2. 通过断言来将空接口转换为定制类型
      v, ok := p.(int) //ok=true时转换成功
    

      

    Go接口最佳实践
    倾向于使用更小的接口,很多接口只包含一个方法,目的是让实现者负担更小
    例如

    type Reader interface {
        Read(p []byte) (n int, err error)
    }
    
    type Writer interface {
        Write(p []byte) (n int, err error)
    }
    

      

    较大的接口定义,可以由多个小接口定义组合而成
    例如:

    type ReadWrite interface {
        Reader
        Writer
    }
    

      



    只依赖于必要功能的最小接口
    例如:

    func StoreData(reader Reader) error {
      ...
    }
    

      

    相关代码如下:

    package empty_interface
    
    import (
    	"testing"
    	"fmt"
    )
    
    func DoSomething(p interface{}){
    	// if i,ok:=p.(int); ok{
    	// 	fmt.Println("Integer", i)
    	// 	return
    	// }
    	// if i,ok:=p.(string); ok{
    	// 	fmt.Println("string", i)
    	// 	return
    	// }
    
    	// fmt.Println("Unknow Type")
    
    	//使用switch简化上面的结构
    	switch v:=p.(type){
    		case int:
    			fmt.Println("Integer", v)
    		case string:
    			fmt.Println("string", v)
    		default:
    			fmt.Println("Unknow Type")
    	}
    
    	return
    }
    
    func TestEmptyInterfaceAssertion(t *testing.T){
    	DoSomething(10)
    	DoSomething("15")
    	DoSomething('z')
    }
    

      执行结果为:

    === RUN   TestEmptyInterfaceAssertion
    Integer 10
    string 15
    Unknow Type
    --- PASS: TestEmptyInterfaceAssertion (0.00s)
    PASS
    coverage: [no statements]
    ok  	Session13/empty_interface	0.261s	coverage: [no statements]
    

      有些泛型的味道了~~

  • 相关阅读:
    孩子们的游戏(圆圈中最后剩下的数)
    求1+2+3+...+n
    扑克牌顺子
    Java 好文整理
    翻转单词顺序列
    左旋转字符串
    和为S的两个数字
    和为S的连续正数序列
    平衡二叉树
    java 构造函数
  • 原文地址:https://www.cnblogs.com/dogtwo0214/p/13419229.html
Copyright © 2011-2022 走看看