2016-04-22 2 views
-1

Может кто-нибудь объяснить, что означает следующий синтаксис в Go, в особенности по:Что это делает в Go, выглядит как литой

x.([]byte) 

Я не уверен, что это значит, это слепок? Но для какого метода, так как это сразу после точки?

func of(x interface{}) ByteView { 
    if bytes, ok := x.([]byte); ok { 
     return ByteView{b: bytes} 
    } 
    return ByteView{s: x.(string)} 
} 

Ссылка: https://github.com/golang/groupcache/blob/master/byteview_test.go#L55

+0

Проверить это https://golang.org/doc/effective_go.html#interface_conversions –

+0

это удобный способ получить конкретный тип, который реализует интерфейс. это утверждение типа. интерфейс {} может принимать любой тип, в этом случае, если этот тип является [] байтом, тогда он будет назначен «байтам», а «ok» укажет, что это тот тип, то есть ok - это bool. проверьте это https://golang.org/ref/spec#Type_assertions – Snowman

ответ

4

Мы называем это "утверждение типа."

Это полностью задокументировано в Language Spec. Чтобы получить весь ответ здесь на SO (так как это весь ответ), а не ответ только для ссылок, я включу его в самую актуальную информацию из спецификации. Это документация, не мой ответ ...

Для выражения х типа интерфейса и типа Т, первичного выражения

x.(T) 

утверждает, что х не ноль, а значение, хранящееся в x имеет значение тип T. Обозначение x. (T) называется утверждением типа.

Более точно, если Т не является типом интерфейса, х. (Т) утверждает, что динамического типа х идентичен типу T. В этом случае Т должен осуществить тип (интерфейс) х ; в противном случае утверждение типа недействительно, так как невозможно сохранить значение типа T. Если T является типом интерфейса, x. (T) утверждает, что динамический тип x реализует интерфейс T.

Если утверждение типа имеет значение, значение выражения представляет собой значение , хранящееся в x, а его тип - T. Если утверждение типа ложно, происходит паника во время выполнения. Другими словами, хотя динамический тип x известен только во время выполнения, тип x. (T) известен как T в правильной программе .

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() } 
var y I 
s := y.(string)  // illegal: string does not implement I (missing method m) 
r := y.(io.Reader)  // r has type io.Reader and y must implement both I and io.Reader 

Тип утверждение используется в назначении или инициализации специальной формы

v, ok = x.(T) 
v, ok := x.(T) 
var v, ok = x.(T) 

дает дополнительное нетипизированное логическое значение. Значение ok является истинным, если утверждение выполнено. В противном случае это значение false, а значение v является нулевым значением для типа T. В этом случае не происходит паники во время выполнения.

Эффективное Go является еще одним большим ресурсом, который также включает в себя раздел преобразования интерфейса и тип утверждения: https://golang.org/doc/effective_go.html#interface_conversions

Смежные вопросы