<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ryo Nakao</title>
    <description>The latest articles on DEV Community by Ryo Nakao (@nakabonne).</description>
    <link>https://dev.to/nakabonne</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F381780%2F90ed532a-a69d-43d2-be72-c6dd53f0e711.png</url>
      <title>DEV Community: Ryo Nakao</title>
      <link>https://dev.to/nakabonne</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nakabonne"/>
    <language>en</language>
    <item>
      <title>Announcing PipeCD</title>
      <dc:creator>Ryo Nakao</dc:creator>
      <pubDate>Tue, 06 Oct 2020 14:00:32 +0000</pubDate>
      <link>https://dev.to/nakabonne/announcing-pipecd-ea1</link>
      <guid>https://dev.to/nakabonne/announcing-pipecd-ea1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is originally posted &lt;a href="https://pipecd.dev/blog/2020/10/06/announcing-pipecd/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Today we are excited to announce the open-source availability of PipeCD: a continuous delivery system for declarative Kubernetes, Serverless, and Infrastructure applications.&lt;br&gt;
PipeCD aims to provide a unified CD solution for multiple application kinds on multi-cloud that empowers engineers to deploy faster with more confidence.&lt;br&gt;
It is also available as a GitOps tool that enables doing deployment operations by pull request on Git.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IV2UlLc7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/amzomq4irtpdubw2005g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IV2UlLc7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/amzomq4irtpdubw2005g.png" alt="deployment-details"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;As one of our Developer Productivity team's missions, we aim to empower engineers to deploy their services faster, more frequently with reliability.&lt;br&gt;
Martin Fowler, in his book &lt;em&gt;Continuous Delivery&lt;/em&gt;, points out that "The biggest risk to any software effort is that you end up building something that isn't useful. The earlier and more frequently you get working software in front of real users, the quicker you get feedback to find out how valuable it really is."&lt;/p&gt;

&lt;p&gt;Recently, with the popularity of cloud services and the container technology, engineers have even more options in choosing the infrastructure model, the cloud services, which are most suitable for their team's requirements.&lt;br&gt;
At &lt;a href="https://www.cyberagent.co.jp/en/"&gt;CyberAgent&lt;/a&gt;, we have a large number of services from many teams where each team can have a different infrastructure model and a different cloud service. Some big projects also deploy their services on multi-cloud.&lt;br&gt;
This diversification leads to a problem that we are facing, lacking a robust CD system for all teams.&lt;/p&gt;

&lt;p&gt;So we decided to create a new CD system that provides a unified interface for many application kinds to improve the developer experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;p&gt;While designing PipeCD, we focused on the following &lt;a href="https://pipecd.dev"&gt;4 key features&lt;/a&gt; with the aim of creating a CD system that provides a good experience for both developers and operators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Visibility is one of the most requested factors we received when surveying engineers in our company.&lt;br&gt;
Visibility is the ability to see what's going on in the cluster, the ability to see how each component of the application had been deployed, the ability to know quickly why the deployment was failed.&lt;br&gt;
Visibility for a team leader is the ability to know the delivery performance of the team and what metrics should be improved.&lt;br&gt;
With PipeCD, we always strive to maximize the visibility for engineers, operators as well as team leaders. Currently, it includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment pipeline UI shows clarify what is happening&lt;/li&gt;
&lt;li&gt;Separate logs viewer for each individual deployment&lt;/li&gt;
&lt;li&gt;Realtime visualization of application component and state&lt;/li&gt;
&lt;li&gt;Deployment notifications to slack, webhook endpoints&lt;/li&gt;
&lt;li&gt;Insights show the delivery performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition, the entire state of the service is managed through Git, so you can view the whole state of the cluster and all audit logs provided by Git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automation reduces or removes repetitive overhead of frequent releases. So maximizing automation helps to minimize human error during the deployment process, as well as reduce the amount of work engineers need to do.&lt;br&gt;
PipeCD has the following automated functionalities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated deployment analysis based on metrics, logs, emitted requests&lt;/li&gt;
&lt;li&gt;Automatically roll back to the previous state as soon as analysis or a pipeline stage fails&lt;/li&gt;
&lt;li&gt;Automatically detect configuration drift to notify and render the changes&lt;/li&gt;
&lt;li&gt;Automatically watch and detect the new container images to deploy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Secure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The CD system often carries a lot of credentials needed to access the cluster and the necessary services of the teams.&lt;br&gt;
Ensuring the safety of the teams is always on our top priority.&lt;br&gt;
So while designing the PipeCD, we decided not to store those credentials in a central place. Instead of that, all user's credentials always stay inside their clusters.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support single sign-on and role-based access control&lt;/li&gt;
&lt;li&gt;Credentials are not exposed outside the cluster and not saved in the control-plane&lt;/li&gt;
&lt;li&gt;Piped makes only outbound requests and can run inside a restricted network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Multi-provider &amp;amp; Multi-Tenancy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multi-provider means supporting multiple cloud services, multiple container registries, multiple monitoring services for doing deployment analysis.&lt;br&gt;
You can use PipeCD to deploy your Kubernetes applications, CloudRun, AWS Lambda application and Terraform application.&lt;br&gt;
It also supports doing progressive delivery with canary and bluegreen strategy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to operate multi-cluster, multi-tenancy by separating control-plane and piped&lt;/li&gt;
&lt;li&gt;Support multiple analysis providers including Prometheus, Datadog, Stackdriver, and more&lt;/li&gt;
&lt;li&gt;Support multiple application kinds on multi-cloud including Kubernetes, Terraform, Cloud Run, AWS Lambda&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;While designing PipeCD, we simplified its architecture by minimizing the number of components, so you do not have to install many things to enable all features.&lt;br&gt;
In addition, PipeCD also supports storing data in several fully-managed services to minimize the operating cost.&lt;/p&gt;

&lt;p&gt;Currently, we have completed the basic features and many of the features are in the alpha status. We are working hard to increase the stability and planning to release a stable version in the next months.&lt;/p&gt;

&lt;h3&gt;
  
  
  Community
&lt;/h3&gt;

&lt;p&gt;PipeCD team hopes to receive a warm welcome and feedback from the open-source community.&lt;br&gt;
We value every contribution and invite you to join us on GitHub, Slack and Twitter.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit our website and documentation at &lt;a href="https://pipecd.dev"&gt;https://pipecd.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Check out the code at &lt;a href="https://github.com/pipe-cd/pipe"&gt;https://github.com/pipe-cd/pipe&lt;/a&gt; or explore the &lt;a href="https://pipecd.dev/docs/examples/"&gt;examples&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Join us on Slack &lt;a href="https://cloud-native.slack.com/archives/C01B27F9T0X"&gt;@cloud-native/pipecd&lt;/a&gt; to chat with other developers&lt;/li&gt;
&lt;li&gt;Follow us on Twitter &lt;a href="https://twitter.com/pipecd_dev"&gt;@pipecd_dev&lt;/a&gt; to get the latest news&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PipeCD team is hiring engineers/interns to work on PipeCD. Please contact us if you are interested.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanks
&lt;/h3&gt;

&lt;p&gt;Finally, we would like to thank the existing open-source CD projects like Spinnaker, FluxCD, ArgoCD... PipeCD has been built on many great ideas from those great projects.&lt;br&gt;
PipeCD team would also like to thank CyberAgent's engineers and collaborators from other companies, who have sent us so many valuable feedback throughout the development process to this day.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>go</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Take a walk the Go AST</title>
      <dc:creator>Ryo Nakao</dc:creator>
      <pubDate>Mon, 28 Sep 2020 08:54:25 +0000</pubDate>
      <link>https://dev.to/nakabonne/take-a-walk-the-go-ast-e02</link>
      <guid>https://dev.to/nakabonne/take-a-walk-the-go-ast-e02</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is originally posted &lt;a href="https://nakabonne.dev/posts/take-a-walk-the-go-ast/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What do you refer to when you're curious about the Go AST? A document? Source code?&lt;br&gt;
While reading the documentation helps you understand it in the abstract, you can't see how APIs relate to each other, etc.&lt;br&gt;
Not to mention, read the entire source code and you'll see it completely, but you should get tired from trying to read the whole stuff.&lt;/p&gt;

&lt;p&gt;Therefore, this article aims to be in the middle of them. Let's take it easy and take a walk through AST to understand how the Go code we usually write is represented internally.&lt;/p&gt;

&lt;p&gt;It doesn't delve into how to parse the source code, and starts with the description after the AST is built.&lt;br&gt;
If you're curious about how the code is converted to the AST, navigate to &lt;a href="https://nakabonne.dev/posts/digging-deeper-into-the-analysis-of-go-code/"&gt;Digging deeper into the analysis of Go-code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s get started!&lt;/p&gt;
&lt;h2&gt;
  
  
  Interfaces
&lt;/h2&gt;

&lt;p&gt;First up, let me briefly describe the interface that represents each of the AST nodes.&lt;br&gt;
All AST nodes implement the &lt;a href="https://pkg.go.dev/go/ast?tab=doc#Node"&gt;&lt;code&gt;ast.Node&lt;/code&gt;&lt;/a&gt; interface, which just returns a position in the AST.&lt;br&gt;&lt;br&gt;
In addtion, there are 3 main interfaces that implement &lt;code&gt;ast.Node&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/go/ast?tab=doc#Expr"&gt;ast.Expr&lt;/a&gt; — representing expressions and types node&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/go/ast?tab=doc#Stmt"&gt;ast.Stmt&lt;/a&gt; — representing statement node&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/go/ast?tab=doc#Decl"&gt;ast.Decl&lt;/a&gt; — representing declaration node&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oBl6iqJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1muli58v195ibjjoh2k1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oBl6iqJj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1muli58v195ibjjoh2k1.png" alt="node-interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see from the definition that every Node satisfies the &lt;code&gt;ast.Node&lt;/code&gt; interface:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/golang/go/blob/0b7c202e98949b530f7f4011efd454164356ba69/src/go/ast/ast.go#L32-L54"&gt;ast/ast.go&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// All node types implement the Node interface.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Pos&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pos&lt;/span&gt; &lt;span class="c"&gt;// position of first character belonging to the node&lt;/span&gt;
    &lt;span class="n"&gt;End&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pos&lt;/span&gt; &lt;span class="c"&gt;// position of first character immediately after the node&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// All expression nodes implement the Expr interface.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Expr&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Node&lt;/span&gt;
    &lt;span class="n"&gt;exprNode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// All statement nodes implement the Stmt interface.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Stmt&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Node&lt;/span&gt;
    &lt;span class="n"&gt;stmtNode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// All declaration nodes implement the Decl interface.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Decl&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Node&lt;/span&gt;
    &lt;span class="n"&gt;declNode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting started with walking
&lt;/h2&gt;

&lt;p&gt;Let's start walking! Take a look at the file we convert to the AST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Nothing fancy — an overly simple Hello, World program. The AST built on this is:&lt;/p&gt;

&lt;p&gt;ast.File&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Package&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Decls&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decl&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GenDecl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;TokPos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Tok&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Lparen&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Specs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Spec&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImportSpec&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicLit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;ValuePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;fmt&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;EndPos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Rparen&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FuncDecl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"greet"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Obj&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"greet"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Decl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt; &lt;span class="m"&gt;23&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FuncType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FieldList&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Opening&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Closing&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlockStmt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Lbrace&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stmt&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExprStmt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallExpr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Fun&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectorExpr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Sel&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Println"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Lparen&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Expr&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicLit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;ValuePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;Hello, World&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Ellipsis&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Rparen&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Rbrace&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Scope&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scope&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Objects&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="s"&gt;"greet"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt; &lt;span class="m"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Imports&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImportSpec&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Unresolved&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt; &lt;span class="m"&gt;46&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  How to walk
&lt;/h4&gt;

&lt;p&gt;All we have to do is traverse this AST node in depth-first order.&lt;br&gt;
Let's print each Node one by one by calling &lt;a href="https://pkg.go.dev/go/ast?tab=doc#Inspect"&gt;&lt;code&gt;ast.Inspect()&lt;/code&gt;&lt;/a&gt; recursively.&lt;/p&gt;

&lt;p&gt;Also, printing AST directly then we will typically see stuff that is not human readable. &lt;br&gt;
To prevent that from happening, we're going to use &lt;a href="https://pkg.go.dev/go/ast?tab=doc#Print"&gt;&lt;code&gt;ast.Print&lt;/code&gt;&lt;/a&gt;, a powerful API for human reading of AST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"go/ast"&lt;/span&gt;
    &lt;span class="s"&gt;"go/parser"&lt;/span&gt;
    &lt;span class="s"&gt;"go/token"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fset&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewFileSet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ParseFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"dummy.go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ParseComments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Inspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Called recursively.&lt;/span&gt;
        &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;`package hello

import "fmt"

func greet() {
    fmt.Println("Hello, World")
}
`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  ast.File
&lt;/h3&gt;

&lt;p&gt;The first Node to visit is &lt;a href="https://pkg.go.dev/go/ast?tab=doc#File"&gt;&lt;code&gt;*ast.File&lt;/code&gt;&lt;/a&gt;, which is the root of all AST nodes.&lt;br&gt;
It implements only the &lt;code&gt;ast.Node&lt;/code&gt; interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RpDJ1XvC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3ns7pr7eb7edwh96um11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RpDJ1XvC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3ns7pr7eb7edwh96um11.png" alt="ast-file-tree"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ast.File&lt;/code&gt; has references to a package name, import declarations, and function declarations as child nodes.&lt;br&gt;
To be precise, it has also &lt;code&gt;Comments&lt;/code&gt; and so on, but let me omit them for simplicity.&lt;br&gt;
Let's start with Package Name.&lt;/p&gt;

&lt;p&gt;(Note that fields with a nil value are omitted. See &lt;a href="https://pkg.go.dev/go/ast"&gt;the document&lt;/a&gt; for a complete list of fields for each node type.)&lt;/p&gt;
&lt;h3&gt;
  
  
  Package Name
&lt;/h3&gt;
&lt;h4&gt;
  
  
  ast.Ident
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A package name can be represented by the AST node type &lt;a href="https://pkg.go.dev/go/ast?tab=doc#Ident"&gt;&lt;code&gt;*ast.Ident&lt;/code&gt;&lt;/a&gt;, which implements the &lt;code&gt;ast.Expr&lt;/code&gt; interface.&lt;br&gt;
All identifiers are represented by this structure. It mainly contains its name and a source position within a file set.&lt;br&gt;&lt;br&gt;
From the code shown above, we can see that the package name is &lt;code&gt;hello&lt;/code&gt; and is declared in the first line of &lt;code&gt;dummy.go&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We can't dive any deeper into this node, let's go back to the &lt;code&gt;*ast.File&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Import Declarations
&lt;/h3&gt;
&lt;h4&gt;
  
  
  ast.GenDecl
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GenDecl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;TokPos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Tok&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Lparen&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Specs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Spec&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImportSpec&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Rparen&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A declaration of import is represented by the AST node type &lt;a href="https://pkg.go.dev/go/ast?tab=doc#GenDecl"&gt;&lt;code&gt;*ast.GenDecl&lt;/code&gt;&lt;/a&gt;, which implements the &lt;code&gt;ast.Decl&lt;/code&gt; interface.&lt;br&gt;
&lt;code&gt;ast.GenDecl&lt;/code&gt; represents all declarations except for functions; That is, import, const, var, and type.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Tok&lt;/code&gt; represents a lexical token — which is specifies what the declaration is about (IMPORT or CONST or TYPE or VAR).&lt;br&gt;&lt;br&gt;
This AST Node tells us that the import declaration is on line 3 in &lt;code&gt;dummy.go&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's visit &lt;code&gt;ast.GenDecl&lt;/code&gt; in depth-first order. Take a look &lt;code&gt;*ast.ImportSpec&lt;/code&gt;, the next Node.&lt;/p&gt;
&lt;h4&gt;
  
  
  ast.ImportSpec
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImportSpec&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicLit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;EndPos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;An &lt;a href="https://pkg.go.dev/go/ast?tab=doc#ImportSpec"&gt;&lt;code&gt;ast.ImportSpec&lt;/code&gt;&lt;/a&gt; node corresponds to a single import declaration.&lt;br&gt;
It implements the &lt;a href="https://pkg.go.dev/go/ast?tab=doc#Spec"&gt;&lt;code&gt;ast.Spec&lt;/code&gt;&lt;/a&gt; interface.&lt;br&gt;
Visiting &lt;code&gt;Path&lt;/code&gt; could make more sense about the import path. Let's go there.&lt;/p&gt;
&lt;h4&gt;
  
  
  ast.BasicLit
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicLit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;ValuePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;fmt&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;An &lt;a href="https://pkg.go.dev/go/ast?tab=doc#BasicLit"&gt;&lt;code&gt;ast.BasicLit&lt;/code&gt;&lt;/a&gt; node represents a literal of basic type.&lt;br&gt;
It implements the &lt;code&gt;ast.Expr&lt;/code&gt; interface.&lt;br&gt;
This contains a type of token and &lt;code&gt;token.INT&lt;/code&gt;, &lt;code&gt;token.FLOAT&lt;/code&gt;, &lt;code&gt;token.IMAG&lt;/code&gt;, &lt;code&gt;token.CHAR&lt;/code&gt;, or &lt;code&gt;token.STRING&lt;/code&gt; can be used.&lt;br&gt;&lt;br&gt;
From &lt;code&gt;ast.ImportSpec&lt;/code&gt; and &lt;code&gt;ast.BasicLit&lt;/code&gt;, we can see it has imported package called "fmt".&lt;/p&gt;

&lt;p&gt;We can't dive any deeper, let's get back to the top level again.&lt;/p&gt;
&lt;h3&gt;
  
  
  Function Declarations
&lt;/h3&gt;
&lt;h4&gt;
  
  
  ast.FuncDecl
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FuncDecl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FuncType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlockStmt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;An &lt;a href="https://pkg.go.dev/go/ast?tab=doc#FuncDecl"&gt;&lt;code&gt;ast.FuncDecl&lt;/code&gt;&lt;/a&gt; node represents a function declaration.&lt;br&gt;
It implements only the &lt;code&gt;ast.Node&lt;/code&gt; interface.&lt;br&gt;
Let's take a look at them in order from &lt;code&gt;Name&lt;/code&gt;, representing a function name.&lt;/p&gt;
&lt;h4&gt;
  
  
  ast.Ident
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"greet"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Obj&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"greet"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Decl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The second time this has appeared, let me skip the basic explanation.&lt;/p&gt;

&lt;p&gt;Noteworthy is the &lt;a href="https://pkg.go.dev/go/ast?tab=doc#Object"&gt;&lt;code&gt;*ast.Object&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
It represents the object to which the identifier refers, but why is this needed?&lt;br&gt;
As you know, Go has a concept of scope, which is the extent of source text in which the identifier denotes the specified constant, type, variable, function, label, or package.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Decl&lt;/code&gt; field indicates where the identifier was declared so that it identifies the scope of the identifier.&lt;br&gt;
Identifiers that point to the identical object share the identical &lt;code&gt;*ast.Object&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  ast.FuncType
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FuncType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Params&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FieldList&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Go back to being a parent one generation older, an &lt;a href="https://pkg.go.dev/go/ast?tab=doc#FuncType"&gt;&lt;code&gt;ast.FuncType&lt;/code&gt;&lt;/a&gt; contains a function signature including parameters, results, and position of "func" keyword.&lt;/p&gt;
&lt;h4&gt;
  
  
  ast.FieldList
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FieldList&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Opening&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Closing&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;An &lt;a href="https://pkg.go.dev/go/ast?tab=doc#FieldList"&gt;&lt;code&gt;ast.FieldList&lt;/code&gt;&lt;/a&gt; node represents a list of Fields, enclosed by parentheses or braces.&lt;br&gt;
Function parameters would be shown here if they are defined, but this time none, so no information.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;List&lt;/code&gt; field is a slice of &lt;a href="https://pkg.go.dev/go/ast?tab=doc#Field"&gt;&lt;code&gt;*ast.Field&lt;/code&gt;&lt;/a&gt; that contains a pair of identifiers and types.&lt;br&gt;
It is highly versatile and is used for a variety of Nodes, including &lt;a href="https://pkg.go.dev/go/ast?tab=doc#StructType"&gt;&lt;code&gt;*ast.StructType&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://pkg.go.dev/go/ast?tab=doc#InterfaceType"&gt;&lt;code&gt;*ast.InterfaceType&lt;/code&gt;&lt;/a&gt;, and here.&lt;br&gt;
That is, it's needed when mapping a type to an identifier as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let's loop back to &lt;code&gt;*ast.FuncDecl&lt;/code&gt; again and dive a bit into &lt;code&gt;Body&lt;/code&gt;, the last field.&lt;/p&gt;

&lt;h4&gt;
  
  
  ast.BlockStmt
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlockStmt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Lbrace&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stmt&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExprStmt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Rbrace&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;An &lt;a href="https://pkg.go.dev/go/ast?tab=doc#BlockStmt"&gt;&lt;code&gt;ast.BlockStmt&lt;/code&gt;&lt;/a&gt; node represents a braced statement list.&lt;br&gt;
It implements  the &lt;code&gt;ast.Stmt&lt;/code&gt; interface.&lt;br&gt;
It does have a list of statements. What an imaginable node!&lt;/p&gt;

&lt;h4&gt;
  
  
  ast.ExprStmt
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExprStmt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallExpr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://pkg.go.dev/go/ast?tab=doc#ExprStmt"&gt;&lt;code&gt;ast.ExprStmt&lt;/code&gt;&lt;/a&gt; represents an expression in a statement list.&lt;br&gt;
It implements the &lt;code&gt;ast.Stmt&lt;/code&gt; interface and contains a single &lt;code&gt;ast.Expr&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  ast.CallExpr
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CallExpr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Fun&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectorExpr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Lparen&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Expr&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicLit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="c"&gt;/* Omission */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Ellipsis&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Rparen&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://pkg.go.dev/go/ast?tab=doc#CallExpr"&gt;&lt;code&gt;ast.CallExpr&lt;/code&gt;&lt;/a&gt; represents an expression that calls a function.&lt;br&gt;
The fields to look at are &lt;code&gt;Fun&lt;/code&gt;, the function to call and &lt;code&gt;Args&lt;/code&gt;, the list of arguments to pass to it.&lt;/p&gt;

&lt;h4&gt;
  
  
  ast.SelectorExpr
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectorExpr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Sel&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Println"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://pkg.go.dev/go/ast?tab=doc#SelectorExpr"&gt;&lt;code&gt;ast.SelectorExpr&lt;/code&gt;&lt;/a&gt; represents an expression followed by a selector.&lt;br&gt;
Simply put, it means &lt;code&gt;fmt.Println&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  ast.BasicLit
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicLit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;ValuePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;Hello, World&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;No longer needed an explanation, Hello, World!&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;I've left out some of the fields in the node types I've introduced, and there are still many other node types.&lt;/p&gt;

&lt;p&gt;Nevertheless, I'd say it's significant to actually walk the walk even if it's a bit rough. And above all, it’s quite a bit of fun.&lt;br&gt;
Copy and paste the code shown in the section "How to walk", and have a try to walk around on your PC.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>ast</category>
    </item>
    <item>
      <title>Digging deeper into the analysis of Go-code</title>
      <dc:creator>Ryo Nakao</dc:creator>
      <pubDate>Fri, 25 Sep 2020 23:57:30 +0000</pubDate>
      <link>https://dev.to/nakabonne/digging-deeper-into-the-analysis-of-go-code-31af</link>
      <guid>https://dev.to/nakabonne/digging-deeper-into-the-analysis-of-go-code-31af</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is originally posted &lt;a href="https://nakabonne.dev/posts/digging-deeper-into-the-analysis-of-go-code/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The analysis of source code at the syntactic level can help you with your coding in a variety of ways. For that, the text is almost always converted to AST first to make it easier to handle in most languages.&lt;br&gt;&lt;br&gt;
As some of you may know, Go has a powerful package &lt;a href="https://pkg.go.dev/go/parser"&gt;&lt;code&gt;go/parser&lt;/code&gt;&lt;/a&gt;, with it, you can convert source code to AST relatively easily.&lt;br&gt;
However, I couldn't help but be curious about how it is working, and I realized my mind could only be satisfied by getting started to read the API implementation.&lt;br&gt;
In this article, I will walk you through how it is converted, by reading the implementation of its API.  &lt;/p&gt;

&lt;p&gt;Even those unfamiliar with the Go language don't need to close the tab in the browsers, as this is a generic enough article to understand how programming languages are analyzed.&lt;br&gt;&lt;br&gt;
This article is also the first step in understanding the compiler and interpreter, as well as delving into static analysis.&lt;/p&gt;
&lt;h2&gt;
  
  
  AST
&lt;/h2&gt;

&lt;p&gt;Let's start with some of the knowledge you need to read the implementation.&lt;br&gt;
What is AST(Abstract Syntax Tree)? According to &lt;a href="https://en.wikipedia.org/wiki/Abstract_syntax_tree"&gt;Wikipedia&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In computer science, an abstract syntax tree (AST), or just syntax tree, is a tree representation of the abstract syntactic structure of source code written in a programming language. Each node of the tree denotes a construct occurring in the source code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most compilers and interpreters use AST as an internal representation of the source code; AST typically omits semicolons, line feed characters, white spaces, braces, square brackets, and round brackets from the syntax tree, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you can do with AST:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source code analysis&lt;/li&gt;
&lt;li&gt;Code generation&lt;/li&gt;
&lt;li&gt;Can be rewritten&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How to convert to AST
&lt;/h2&gt;

&lt;p&gt;Plain text is quite straightforward for us, but from a machine, nothing is tougher to handle. Therefore, you have to first do lexical analysis the text with a lexer. The general flow is to pass it to a parser and retrieve the AST.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--leuFdYos--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/suy8xj3j7t8em6oqvnfz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--leuFdYos--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/suy8xj3j7t8em6oqvnfz.png" alt="Parsing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd prefer to point out here that there is not a single universal AST format which can be used by any parser.&lt;br&gt;
For instance, &lt;code&gt;x + 2&lt;/code&gt; in Go is represented by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BinaryExpr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ident&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;NamePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"x"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Obj&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bad&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;OpPos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Op&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicLit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;ValuePos&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;INT&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"2"&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Lexical analysis
&lt;/h3&gt;

&lt;p&gt;As mentioned earlier, the analysis typically starts by passing the text to a lexer and then fetching the tokens. A token is a string with an assigned and thus identified meaning.&lt;br&gt;
&lt;a href="https://pkg.go.dev/go/scanner?tab=doc#Scanner"&gt;&lt;code&gt;go/scanner.Scanner&lt;/code&gt;&lt;/a&gt; is in charge of the lexer in Go.&lt;br&gt;&lt;br&gt;
What is the identified meaning? Seeing is believing.&lt;/p&gt;

&lt;p&gt;Let's say you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"foo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is what happens when you tokenize it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;PACKAGE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;IDENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;CONST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;IDENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ASSIGN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;EOF&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;All tokens in Go are defined &lt;a href="https://pkg.go.dev/go/token?tab=doc#Token"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Peeling away at the parsing API
&lt;/h2&gt;

&lt;p&gt;To convert a Go source file to AST, just call &lt;a href="https://pkg.go.dev/go/parser?tab=doc#ParseFile"&gt;&lt;code&gt;go/parser.ParseFile&lt;/code&gt;&lt;/a&gt; as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;fset&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewFileSet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ParseFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"foo.go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ParseComments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now that we've figured out the conversion steps by the previous chapter, let's actually read the internal implementation of that method! (The version of Go we refer to is 1.14.1).&lt;/p&gt;

&lt;h3&gt;
  
  
  Scanner.Scan() — a method for Lexical Analysis
&lt;/h3&gt;

&lt;p&gt;How does Go perform lexical analysis? As previously mentioned, &lt;a href="https://pkg.go.dev/go/scanner?tab=doc#Scanner"&gt;&lt;code&gt;go/scanner.Scanner&lt;/code&gt;&lt;/a&gt; is in charge of the lexer in Go.&lt;br&gt;
Thus at first, let's take a closer look at that &lt;a href="https://pkg.go.dev/go/scanner?tab=doc#Scanner.Scan"&gt;&lt;code&gt;Scanner.Scan()&lt;/code&gt;&lt;/a&gt; method — which is called by &lt;code&gt;parser.ParseFile()&lt;/code&gt; internally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/golang/go/blob/5aef51a729f428bfd4b2c28fd2ba7950660608e0/src/go/scanner/scanner.go#L792-L801"&gt;scanner/scanner.go&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Scanner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lit&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="c"&gt;// Omission&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;isLetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;lit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scanIdentifier&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// keywords are longer than one letter - avoid lookup otherwise&lt;/span&gt;
            &lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IDENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BREAK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONTINUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FALLTHROUGH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RETURN&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;insertSemi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="c"&gt;// Omission&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ch&lt;/code&gt; is the current character held by Scanner. &lt;code&gt;Scanner.Scan()&lt;/code&gt; advances to next character by calling &lt;code&gt;Scanner.next()&lt;/code&gt; and populates &lt;code&gt;ch&lt;/code&gt;, as long as it is available as an identifier name.&lt;br&gt;
The code above is for the case where &lt;code&gt;ch&lt;/code&gt; is a letter; It pauses its advance as soon as it encounters a character that cannot be used as an identifier and then determines the type of token.&lt;/p&gt;

&lt;p&gt;There are different ways to determine where does a single token start and where does it end, depending on the character. For instance, in the case of String, it continues to advance until &lt;code&gt;"&lt;/code&gt; appears:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/golang/go/blob/5aef51a729f428bfd4b2c28fd2ba7950660608e0/src/go/scanner/scanner.go#L823-L826"&gt;scanner/scanner.go&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="sc"&gt;'"'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;insertSemi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;STRING&lt;/span&gt;
    &lt;span class="n"&gt;lit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scanString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Scanner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;scanString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// '"' opening already consumed&lt;/span&gt;
    &lt;span class="n"&gt;offs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'\n'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;offs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"string literal not terminated"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'"'&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'\\'&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scanEscape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;offs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Finally, the Scanner.Scan() method returns a token that has been identified.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parsing
&lt;/h3&gt;

&lt;p&gt;Before taking a look parsing a file, let's check the file structure in Go.&lt;br&gt;
According to &lt;a href="https://golang.org/ref/spec#Source_file_organization"&gt;The Go Programming Language Specification - Source file organization&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Each source file consists of a package clause defining the package to which it belongs, followed by a possibly empty set of import declarations that declare packages whose contents it wishes to use, followed by a possibly empty set of declarations of functions, types, variables, and constants.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is, the structure is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A package clause&lt;/li&gt;
&lt;li&gt;Import declarations&lt;/li&gt;
&lt;li&gt;Top level declarations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After parsing a package clause and import declarations, &lt;code&gt;parser.parseFile()&lt;/code&gt; repeats the parsing of the declaration to the end of the file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/golang/go/blob/5aef51a729f428bfd4b2c28fd2ba7950660608e0/src/go/parser/parser.go#L2559-L2562"&gt;parser/parser.go&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EOF&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;decls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseDecl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;declStart&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So let's look at &lt;code&gt;parser.parseDecl&lt;/code&gt; next.&lt;/p&gt;

&lt;h4&gt;
  
  
  parser.parseDecl() — a method to parse the syntax of a declaration
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;parser.parseDecl()&lt;/code&gt; returns &lt;code&gt;ast.Decl&lt;/code&gt;, the node of the syntax tree representing the declaration in the Go source code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/golang/go/blob/5aef51a729f428bfd4b2c28fd2ba7950660608e0/src/go/parser/parser.go#L2492-L2516"&gt;parser/parser.go&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;parseDecl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sync&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Token&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decl&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Declaration"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;parseSpecFunction&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CONST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VAR&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseValueSpec&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TYPE&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseTypeSpec&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FUNC&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseFuncDecl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errorExpected&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"declaration"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;advance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BadDecl&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseGenDecl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It goes through the tokens and process them differently for each keyword. Let's deep dive into &lt;code&gt;parseFuncDecl()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/golang/go/blob/5aef51a729f428bfd4b2c28fd2ba7950660608e0/src/go/parser/parser.go#L2442-L2455"&gt;parser/parser.go&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LPAREN&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;recv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseParameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;ident&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseIdent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseSignature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlockStmt&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LBRACE&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parseBody&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expectSemi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tok&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEMICOLON&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Internally, it advances the token by calling &lt;code&gt;Scanner.Scan()&lt;/code&gt; — which we saw in detail earlier.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;token.LPAREN&lt;/code&gt; represents &lt;code&gt;(&lt;/code&gt;, so you can see that it starts parsing the parameters as soon as &lt;code&gt;(&lt;/code&gt; is found.&lt;br&gt;&lt;br&gt;
&lt;code&gt;token.LBRACE&lt;/code&gt; represents &lt;code&gt;{&lt;/code&gt;, so you can see that it starts parsing the function body as soon as &lt;code&gt;{&lt;/code&gt; is found.&lt;/p&gt;

&lt;p&gt;.&lt;br&gt;&lt;br&gt;
.&lt;br&gt;&lt;br&gt;
.&lt;br&gt;&lt;br&gt;
Oops, it's going to take forever at this rate...&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Parsing the tokens by myself has made me feel closer to the compiler and interpreter that I used to feel horrible about.&lt;br&gt;
I'd love to dabble in &lt;a href="https://compilerbook.com/"&gt;Writing A Compiler In Go&lt;/a&gt; and &lt;a href="https://interpreterbook.com/"&gt;Writing An Interpreter In Go&lt;/a&gt; as well.&lt;/p&gt;

</description>
      <category>go</category>
      <category>compiler</category>
      <category>ast</category>
    </item>
  </channel>
</rss>
