Введите синтаксис утверждения с помощью go / ast - PullRequest
0 голосов
/ 12 января 2019

Я прочитал фрагмент кода ниже, и я не знаю, какой именно синтаксис д. () в если f, хорошо: = d. (* Ast.FuncDecl); среднее.

Кто-нибудь может мне это объяснить?

package main

import (
    "go/ast"
    "go/parser"
    "go/token"
    "regexp"

    "github.com/posener/complete"
)

func functionsInFile(path string, regexp *regexp.Regexp) (tests []string) {
    fset := token.NewFileSet()
    f, err := parser.ParseFile(fset, path, nil, 0)
    if err != nil {
        complete.Log("Failed parsing %s: %s", path, err)
        return nil
    }
    for _, d := range f.Decls {
        if f, ok := d.(*ast.FuncDecl); ok {
            name := f.Name.String()
            if regexp == nil || regexp.MatchString(name) {
                tests = append(tests, name)
            }
        }
    }
    return
}

1 Ответ

0 голосов
/ 12 января 2019

Как говорится в комментариях, это утверждение типа. Утверждения типа описаны в спецификации Go: https://golang.org/ref/spec#Type_assertions

Применительно к вашему конкретному примеру кода, я думаю, что оно взято из документации модуля AST , которую вы должны прочитать, если хотите работать с Go AST.

ParseFile возвращает ast.File, что:

type File struct {
        Doc        *CommentGroup   // associated documentation; or nil
        Package    token.Pos       // position of "package" keyword
        Name       *Ident          // package name
        Decls      []Decl          // top-level declarations; or nil
        Scope      *Scope          // package scope (this file only)
        Imports    []*ImportSpec   // imports in this file
        Unresolved []*Ident        // unresolved identifiers in this file
        Comments   []*CommentGroup // list of all comments in the source file
}

Итак, Decls - это фрагмент Decl, который является интерфейсом . Вкратце, это означает, что во время компиляции вы не знаете, что представляет собой базовый тип (хотя вы знаете, что он удовлетворяет интерфейсу), поэтому вы делаете утверждение типа во время выполнения, чтобы убедиться, что это то, что вы ожидаете.

    if f, ok := d.(*ast.FuncDecl); ok {
        name := f.Name.String()
        if regexp == nil || regexp.MatchString(name) {
            tests = append(tests, name)
        }
    }

Это означает, что "если d на самом деле FuncDecl, сделайте это".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...