Golang中的类型断言(Type Assertion)

        Golang中的类型断言用于取出动态类型中的值。官方文档说明如下:

For an expression x of interface type and a type T, the primary expression

x.(T)
asserts that x is not nil and that the value stored in x is of type T. The notation x.(T) is called a type assertion.

More precisely, if T is not an interface type, x.(T) asserts that the dynamic type of x is identical to the type T. In this case, T must implement the (interface) type of x; otherwise the type assertion is invalid since it is not possible for x to store a value of type T. If T is an interface type, x.(T) asserts that the dynamic type of x implements the interface T.

If the type assertion holds, the value of the expression is the value stored in x and its type is T. If the type assertion is false, a run-time panic occurs. In other words, even though the dynamic type of x is known only at run time, the type of x.(T) is known to be T in a correct program.

var x interface{} = 7          // x has dynamic type int and value 7
i := x.(int)                   // i has type int and value 7

type I interface { m() }

func f(y I) {
	s := y.(string)        // illegal: string does not implement I (missing method m)
	r := y.(io.Reader)     // r has type io.Reader and the dynamic type of y must implement both I and io.Reader
	…
}
A type assertion used in an assignment or initialization of the special form

v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)
var v, ok interface{} = x.(T) // dynamic types of v and ok are T and bool
yields an additional untyped boolean value. The value of ok is true if the assertion holds. Otherwise it is false and the value of v is the zero value for type T. No run-time panic occurs in this case.

根据文档写出如下代码:

package main

import "fmt"

type I interface {
	String() string
}

type T int

func (t T) String() string{
	return "HELLO"
}

func main(){
	var i T =1000
	var j I =i//亦可写为var j interfacce{}=i,使j为动态类型
	val,ok:=j.(T)//T必须实现接口I
	fmt.Println(val,ok)
}

你可能感兴趣的:(go)