Go 其七 空接口与断言
空接口与断言
- 空接口可以表示任何类型
- 通过断言来将空接口转换为定制类型
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]
有些泛型的味道了~~