رابطها در Go میتوانند دربارهی نوع زیرین ابهام ایجاد کنند. در واقع، رابط خالی میتواند هر مقدار مشخصی را بپذیرد (از جمله مقادیر اولیه). «اظهار نوع» به ما اجازه میدهد مقدار مشخص زیرینِ یک مقدار رابط را با این نحوهی نگارش استخراج کنیم: interfaceVariable.(concreteType).
اگر نتیجهی این دستور را به یک مقدار واحد نسبت دهیم، اظهار میکنیم که متغیر رابط مقداری از نوع مشخص را نگه میدارد. در نتیجه، اگر مقدار رابط نوع مشخص گفتهشده را نداشته باشد، ممکن است در زمان اجرا panic رخ دهد. برای مثال:
var input interface{} = 12
str := input.(string) // panic at runtime since input is not a string!
ما میتوانیم با استفاده از هر دو مقدار بازگشتی اظهار نوع بررسی کنیم که آیا یک مقدار رابط نوع مشخص خاصی را نگه میدارد: مقدار زیرین و یک مقدار «منطقی» که گزارش میدهد آیا اظهار موفق بوده است یا نه. برای مثال:
str, ok := input.(string) // no panic if input is not a string
اگر input یک string را نگه دارد، str مقدار زیرین خواهد بود و ok برابر با «درست» میشود. اگر input یک string را نگه ندارد، str مقدار صفر نوع string خواهد بود (یعنی ""، رشتهی خالی) و ok برابر با «غلط» میشود. در هیچ حالتی panic رخ نمیدهد.
دیدن این نوع الگو رایج است:
str, ok := input.(string)
if !ok {
str = "a default value"
}
یک «انتخاب نوع» میتواند چندین اظهار نوع را پشت سر هم انجام دهد. نحوهی نگارش آن مثل اظهار نوع است (interfaceVariable.(concreteType))، اما بهجای یک concreteType مشخص، از کلیدواژهی type استفاده میکند. این هم یک مثال:
var i interface{} = 12 // try: 12.3, true, int64(12), []int{}, map[string]int{}
switch v := i.(type) {
case int:
fmt.Printf("the integer %d\n", v)
case string:
fmt.Printf("the string %s\n", v)
default:
fmt.Printf("type, %T, not handled explicitly: %#v\n", v, v)
}