基礎(chǔ)結(jié)構(gòu)說(shuō)明
- 普通Node,不是特定語(yǔ)法結(jié)構(gòu),屬于某個(gè)語(yǔ)法結(jié)構(gòu)的一部分.
- Comment 表示一行注釋 // 或者 / /
- CommentGroup 表示多行注釋
- Field 表示結(jié)構(gòu)體中的一個(gè)定義或者變量,或者函數(shù)簽名當(dāng)中的參數(shù)或者返回值
- FieldList 表示以”{}”或者”()”包圍的Filed列表
- Expression & Types (都劃分成Expr接口)
- BadExpr 用來(lái)表示錯(cuò)誤表達(dá)式的占位符
- Ident 比如報(bào)名,函數(shù)名,變量名
- Ellipsis 省略號(hào)表達(dá)式,比如參數(shù)列表的最后一個(gè)可以寫成arg...
- BasicLit 基本字面值,數(shù)字或者字符串
- FuncLit 函數(shù)定義
- CompositeLit 構(gòu)造類型,比如{1,2,3,4}
- ParenExpr 括號(hào)表達(dá)式,被括號(hào)包裹的表達(dá)式
- SelectorExpr 選擇結(jié)構(gòu),類似于a.b的結(jié)構(gòu)
- IndexExpr 下標(biāo)結(jié)構(gòu),類似這樣的結(jié)構(gòu) expr[expr]
- SliceExpr 切片表達(dá)式,類似這樣 expr[low:mid:high]
- TypeAssertExpr 類型斷言類似于 X.(type)
- CallExpr 調(diào)用類型,類似于 expr()
- StarExpr 指針表達(dá)式,類似于 *X
- UnaryExpr 一元表達(dá)式
- BinaryExpr 二元表達(dá)式
- KeyValueExp 鍵值表達(dá)式 key:value
- ArrayType 數(shù)組類型
- StructType 結(jié)構(gòu)體類型
- FuncType 函數(shù)類型
- InterfaceType 接口類型
- MapType map類型
- ChanType 管道類型
- Statements語(yǔ)句
- BadStmt 錯(cuò)誤的語(yǔ)句
- DeclStmt 在語(yǔ)句列表里的申明
- EmptyStmt 空語(yǔ)句
- LabeledStmt 標(biāo)簽語(yǔ)句類似于 indent:stmt
- ExprStmt 包含單獨(dú)的表達(dá)式語(yǔ)句
- SendStmt chan發(fā)送語(yǔ)句
- IncDecStmt 自增或者自減語(yǔ)句
- AssignStmt 賦值語(yǔ)句
- GoStmt Go語(yǔ)句
- DeferStmt 延遲語(yǔ)句
- ReturnStmt return 語(yǔ)句
- BranchStmt 分支語(yǔ)句 例如break continue
- BlockStmt 塊語(yǔ)句 {} 包裹
- IfStmt If 語(yǔ)句
- CaseClause case 語(yǔ)句
- SwitchStmt switch 語(yǔ)句
- TypeSwitchStmt 類型switch 語(yǔ)句 switch x:=y.(type)
- CommClause 發(fā)送或者接受的case語(yǔ)句,類似于 case x <-:
- SelectStmt select 語(yǔ)句
- ForStmt for 語(yǔ)句
- RangeStmt range 語(yǔ)句
- Declarations聲明
- Spec type
- Import Spec
- Value Spec
- Type Spec
- BadDecl 錯(cuò)誤申明
- GenDecl 一般申明(和Spec相關(guān),比如 import “a”,var a,type a)
- FuncDecl 函數(shù)申明
- Files and Packages
- File 代表一個(gè)源文件節(jié)點(diǎn),包含了頂級(jí)元素.
- Package 代表一個(gè)包,包含了很多文件.
以上內(nèi)容轉(zhuǎn)載自某片大神文章..具體地址忘了,知道的告知一下加上連接
定義函數(shù)
&ast.FuncDecl{
Name: id("NewEndpoints"), //函數(shù)名稱
Body: //函數(shù)內(nèi)語(yǔ)句包含在這里
Type: &ast.FuncType{ //這里定義函數(shù)參數(shù)和返回結(jié)果
Params: //函數(shù)參數(shù)
Results: &ast.FieldList{
List: []*ast.Field{
&ast.Field{
Type: &ast.StarExpr{ //返回指針類型
X: ast.NewIdent("Endpoints"),
//.e.g *Endpoints
},
},
&ast.Field{
Type: &ast.SelectorExpr{
X: ast.NewIdent("a"),
Sel: ast.NewIdent("b"),
},
//返回包對(duì)象.e.g : a.b
},
},
},
},
}
例子:
// i.method
//=== Add
//=== Update
//=== UpdateName
//=== UpdateParent
//=== UpdateEnableState
//=== QueryByCode
//=== QueryByLikeName
//=== QueryList
//=== AllTree
//=== AllChildrenCode
elts := make([]ast.Expr, len(i.methods))
for index, v := range i.methods {
elts[index] = &ast.KeyValueExpr{
Key: ast.NewIdent(v.name.Name),
Value: &ast.CallExpr{
Fun: ast.NewIdent("Make" + i.prefix + v.name.Name + "Endpoint"),
Args: []ast.Expr{
&ast.BasicLit{
Kind: token.TYPE,
Value: "s",
},
},
},
}
}
return &ast.FuncDecl{
Name: ast.NewIdent("New" + i.prefix + "Endpoints"),
Body: &ast.BlockStmt{
List: []ast.Stmt{
&ast.AssignStmt{
Lhs: []ast.Expr{
ast.NewIdent("s"),
},
Tok: token.DEFINE,
Rhs: []ast.Expr{
&ast.CompositeLit{
Type: ast.NewIdent("service." + i.prefix + "Service"),
},
},
},
&ast.ReturnStmt{
Results: []ast.Expr{
&ast.UnaryExpr{
Op: token.AND,
X: &ast.CompositeLit{
Type: ast.NewIdent(i.prefix + "Endpoints"),
Elts: elts,
},
},
},
},
},
},
Type: &ast.FuncType{
Results: &ast.FieldList{
List: []*ast.Field{
{
Type: &ast.StarExpr{
X: ast.NewIdent(i.prefix + "Endpoints"),
},
},
},
},
},
}
結(jié)果:
func NewDeptEndpoints() *DeptEndpoints {
s := service.DeptService{}
return &DeptEndpoints{
Add: MakeDeptAddEndpoint(s),
Update: MakeDeptUpdateEndpoint(s),
UpdateName: MakeDeptUpdateNameEndpoint(s),
UpdateParent: MakeDeptUpdateParentEndpoint(s),
UpdateEnableState: MakeDeptUpdateEnableStateEndpoint(s),
QueryByCode: MakeDeptQueryByCodeEndpoint(s),
QueryByLikeName: MakeDeptQueryByLikeNameEndpoint(s),
QueryList: MakeDeptQueryListEndpoint(s),
AllTree: MakeDeptAllTreeEndpoint(s),
AllChildrenCode: MakeDeptAllChildrenCodeEndpoint(s)}
}
語(yǔ)句
dbCall := &ast.CallExpr{ //表達(dá)式語(yǔ)句
Fun: &ast.Ident{
Name: "db.TagConnect", //表達(dá)式內(nèi)容
},
Args: []ast.Expr{ //表達(dá)式參數(shù)集合
&ast.BasicLit{
Kind: token.TYPE,
Value: "dbtag",
},
},
//結(jié)果就是: db.TagConnect(dbtag)
}
db := ast.AssignStmt{ //賦值語(yǔ)句
Lhs: []ast.Expr{
&ast.Ident{ //變量名稱
Name: "q",
},
},
Tok: token.DEFINE, //注意這個(gè)值一定要有這里表示":="
Rhs: []ast.Expr{dbCall}, //后面的表達(dá)式
}
//整體執(zhí)行結(jié)果: q := db.TagConnect(dbtag)
結(jié)構(gòu)體注釋
&ast.GenDecl{
Doc://注釋內(nèi)容
Tok: token.TYPE,
Specs: []ast.Spec{&ast.TypeSpec{
Name: name,
Type: &ast.StructType{
Fields: fields,
},
}},
}
- 結(jié)果:
//注釋內(nèi)容
type name struct {
fields...
}