golang AST语法树解析

1. 源码示例

package main

import (
	"context"
)

// Foo 结构体
type Foo struct {
	i int
}

// Bar 接口
type Bar interface {
	Do(ctx context.Context) error
}

// main方法
func main() {
	a := 1
}

2. Golang中的AST

golang官方提供的几个包,可以帮助我们进行AST分析:

  • go/scanner:词法解析,将源代码分割成一个个token

  • go/token:token类型及相关结构体定义

  • go/ast:ast的结构定义

    • ast的各种结构定义入口在go/ast/ast.go
  • go/parser:语法分析,读取token流生成ast

通过上述的四个库,我们就可以实现golang代码的语法树分析

3. 使用main.go解析demo.go的AST树

package main

import (
	"go/ast"
	"go/parser"
	"go/token"
	"log"
	"path/filepath"
)

func main() {
	fset := token.NewFileSet()
	// 这里取绝对路径,方便打印出来的语法树可以转跳到编辑器
	path, _ := filepath.Abs("./demo.go")
	f, err := parser.ParseFile(fset, path, nil, parser.AllErrors)
	if err != nil {
		log.Println(err)
		return
	}
	// 打印语法树
	ast.Print(fset, f)
}

3.1. 解析的结果如下

可在http://goast.yuroyoro.net/里贴上源代码后查看

*ast.File {
     1  .  Package: 1:1
     2  .  Name: *ast.Ident {
     3  .  .  NamePos: 1:9
     4  .  .  Name: "main"
     5  .  }
     6  .  Decls: []ast.Decl (len = 4) {
     7  .  .  0: *ast.GenDecl {
     8  .  .  .  TokPos: 3:1
     9  .  .  .  Tok: import
    10  .  .  .  Lparen: 3:8
    11  .  .  .  Specs: []ast.Spec (len = 1) {
    12  .  .  .  .  0: *ast.ImportSpec {
    13  .  .  .  .  .  Path: *ast.BasicLit {
    14  .  .  .  .  .  .  ValuePos: 4:2
    15  .  .  .  .  .  .  Kind: STRING
    16  .  .  .  .  .  .  Value: "\"context\""
    17  .  .  .  .  .  }
    18  .  .  .  .  .  EndPos: -
    19  .  .  .  .  }
    20  .  .  .  }
    21  .  .  .  Rparen: 5:1
    22  .  .  }
    23  .  .  1: *ast.GenDecl {
    24  .  .  .  TokPos: 8:1
    25  .  .  .  Tok: type
    26  .  .  .  Lparen: -
    27  .  .  .  Specs: []ast.Spec (len = 1) {
    28  .  .  .  .  0: *ast.TypeSpec {
    29  .  .  .  .  .  Name: *ast.Ident {
    30  .  .  .  .  .  .  NamePos: 8:6
    31  .  .  .  .  .  .  Name: "Foo"
    32  .  .  .  .  .  .  Obj: *ast.Object {
    33  .  .  .  .  .  .  .  Kind: type
    34  .  .  .  .  .  .  .  Name: "Foo"
    35  .  .  .  .  .  .  .  Decl: *(obj @ 28)
    36  .  .  .  .  .  .  }
    37  .  .  .  .  .  }
    38  .  .  .  .  .  Type: *ast.StructType {
    39  .  .  .  .  .  .  Struct: 8:10
    40  .  .  .  .  .  .  Fields: *ast.FieldList {
    41  .  .  .  .  .  .  .  Opening: 8:17
    42  .  .  .  .  .  .  .  List: []*ast.Field (len = 1) {
    43  .  .  .  .  .  .  .  .  0: *ast.Field {
    44  .  .  .  .  .  .  .  .  .  Names: []*ast.Ident (len = 1) {
    45  .  .  .  .  .  .  .  .  .  .  0: *ast.Ident {
    46  .  .  .  .  .  .  .  .  .  .  .  NamePos: 9:2
    47  .  .  .  .  .  .  .  .  .  .  .  Name: "i"
    48  .  .  .  .  .  .  .  .  .  .  .  Obj: *ast.Object {
    49  .  .  .  .  .  .  .  .  .  .  .  .  Kind: var
    50  .  .  .  .  .  .  .  .  .  .  .  .  Name: "i"
    51  .  .  .  .  .  .  .  .  .  .  .  .  Decl: *(obj @ 43)
    52  .  .  .  .  .  .  .  .  .  .  .  }
    53  .  .  .  .  .  .  .  .  .  .  }
    54  .  .  .  .  .  .  .  .  .  }
    55  .  .  .  .  .  .  .  .  .  Type: *ast.Ident {
    56  .  .  .  .  .  .  .  .  .  .  NamePos: 9:4
    57  .  .  .  .  .  .  .  .  .  .  Name: "int"
    58  .  .  .  .  .  .  .  .  .  }
    59  .  .  .  .  .  .  .  .  }
    60  .  .  .  .  .  .  .  }
    61  .  .  .  .  .  .  .  Closing: 10:1
    62  .  .  .  .  .  .  }
    63  .  .  .  .  .  .  Incomplete: false
    64  .  .  .  .  .  }
    65  .  .  .  .  }
    66  .  .  .  }
    67  .  .  .  Rparen: -
    68  .  .  }
    69  .  .  2: *ast.GenDecl {
    70  .  .  .  TokPos: 13:1
    71  .  .  .  Tok: type
    72  .  .  .  Lparen: -
    73  .  .  .  Specs: []ast.Spec (len = 1) {
    74  .  .  .  .  0: *ast.TypeSpec {
    75  .  .  .  .  .  Name: *ast.Ident {
    76  .  .  .  .  .  .  NamePos: 13:6
    77  .  .  .  .  .  .  Name: "Bar"
    78  .  .  .  .  .  .  Obj: *ast.Object {
    79  .  .  .  .  .  .  .  Kind: type
    80  .  .  .  .  .  .  .  Name: "Bar"
    81  .  .  .  .  .  .  .  Decl: *(obj @ 74)
    82  .  .  .  .  .  .  }
    83  .  .  .  .  .  }
    84  .  .  .  .  .  Type: *ast.InterfaceType {
    85  .  .  .  .  .  .  Interface: 13:10
    86  .  .  .  .  .  .  Methods: *ast.FieldList {
    87  .  .  .  .  .  .  .  Opening: 13:20
    88  .  .  .  .  .  .  .  List: []*ast.Field (len = 1) {
    89  .  .  .  .  .  .  .  .  0: *ast.Field {
    90  .  .  .  .  .  .  .  .  .  Names: []*ast.Ident (len = 1) {
    91  .  .  .  .  .  .  .  .  .  .  0: *ast.Ident {
    92  .  .  .  .  .  .  .  .  .  .  .  NamePos: 14:2
    93  .  .  .  .  .  .  .  .  .  .  .  Name: "Do"
    94  .  .  .  .  .  .  .  .  .  .  .  Obj: *ast.Object {
    95  .  .  .  .  .  .  .  .  .  .  .  .  Kind: func
    96  .  .  .  .  .  .  .  .  .  .  .  .  Name: "Do"
    97  .  .  .  .  .  .  .  .  .  .  .  .  Decl: *(obj @ 89)
    98  .  .  .  .  .  .  .  .  .  .  .  }
    99  .  .  .  .  .  .  .  .  .  .  }
   100  .  .  .  .  .  .  .  .  .  }
   101  .  .  .  .  .  .  .  .  .  Type: *ast.FuncType {
   102  .  .  .  .  .  .  .  .  .  .  Func: -
   103  .  .  .  .  .  .  .  .  .  .  Params: *ast.FieldList {
   104  .  .  .  .  .  .  .  .  .  .  .  Opening: 14:4
   105  .  .  .  .  .  .  .  .  .  .  .  List: []*ast.Field (len = 1) {
   106  .  .  .  .  .  .  .  .  .  .  .  .  0: *ast.Field {
   107  .  .  .  .  .  .  .  .  .  .  .  .  .  Names: []*ast.Ident (len = 1) {
   108  .  .  .  .  .  .  .  .  .  .  .  .  .  .  0: *ast.Ident {
   109  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: 14:5
   110  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "ctx"
   111  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Obj: *ast.Object {
   112  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Kind: var
   113  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "ctx"
   114  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Decl: *(obj @ 106)
   115  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  }
   116  .  .  .  .  .  .  .  .  .  .  .  .  .  .  }
   117  .  .  .  .  .  .  .  .  .  .  .  .  .  }
   118  .  .  .  .  .  .  .  .  .  .  .  .  .  Type: *ast.SelectorExpr {
   119  .  .  .  .  .  .  .  .  .  .  .  .  .  .  X: *ast.Ident {
   120  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: 14:9
   121  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "context"
   122  .  .  .  .  .  .  .  .  .  .  .  .  .  .  }
   123  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Sel: *ast.Ident {
   124  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: 14:17
   125  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "Context"
   126  .  .  .  .  .  .  .  .  .  .  .  .  .  .  }
   127  .  .  .  .  .  .  .  .  .  .  .  .  .  }
   128  .  .  .  .  .  .  .  .  .  .  .  .  }
   129  .  .  .  .  .  .  .  .  .  .  .  }
   130  .  .  .  .  .  .  .  .  .  .  .  Closing: 14:24
   131  .  .  .  .  .  .  .  .  .  .  }
   132  .  .  .  .  .  .  .  .  .  .  Results: *ast.FieldList {
   133  .  .  .  .  .  .  .  .  .  .  .  Opening: -
   134  .  .  .  .  .  .  .  .  .  .  .  List: []*ast.Field (len = 1) {
   135  .  .  .  .  .  .  .  .  .  .  .  .  0: *ast.Field {
   136  .  .  .  .  .  .  .  .  .  .  .  .  .  Type: *ast.Ident {
   137  .  .  .  .  .  .  .  .  .  .  .  .  .  .  NamePos: 14:26
   138  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Name: "error"
   139  .  .  .  .  .  .  .  .  .  .  .  .  .  }
   140  .  .  .  .  .  .  .  .  .  .  .  .  }
   141  .  .  .  .  .  .  .  .  .  .  .  }
   142  .  .  .  .  .  .  .  .  .  .  .  Closing: -
   143  .  .  .  .  .  .  .  .  .  .  }
   144  .  .  .  .  .  .  .  .  .  }
   145  .  .  .  .  .  .  .  .  }
   146  .  .  .  .  .  .  .  }
   147  .  .  .  .  .  .  .  Closing: 15:1
   148  .  .  .  .  .  .  }
   149  .  .  .  .  .  .  Incomplete: false
   150  .  .  .  .  .  }
   151  .  .  .  .  }
   152  .  .  .  }
   153  .  .  .  Rparen: -
   154  .  .  }
   155  .  .  3: *ast.FuncDecl {
   156  .  .  .  Name: *ast.Ident {
   157  .  .  .  .  NamePos: 18:6
   158  .  .  .  .  Name: "main"
   159  .  .  .  .  Obj: *ast.Object {
   160  .  .  .  .  .  Kind: func
   161  .  .  .  .  .  Name: "main"
   162  .  .  .  .  .  Decl: *(obj @ 155)
   163  .  .  .  .  }
   164  .  .  .  }
   165  .  .  .  Type: *ast.FuncType {
   166  .  .  .  .  Func: 18:1
   167  .  .  .  .  Params: *ast.FieldList {
   168  .  .  .  .  .  Opening: 18:10
   169  .  .  .  .  .  Closing: 18:11
   170  .  .  .  .  }
   171  .  .  .  }
   172  .  .  .  Body: *ast.BlockStmt {
   173  .  .  .  .  Lbrace: 18:13
   174  .  .  .  .  List: []ast.Stmt (len = 1) {
   175  .  .  .  .  .  0: *ast.AssignStmt {
   176  .  .  .  .  .  .  Lhs: []ast.Expr (len = 1) {
   177  .  .  .  .  .  .  .  0: *ast.Ident {
   178  .  .  .  .  .  .  .  .  NamePos: 19:2
   179  .  .  .  .  .  .  .  .  Name: "a"
   180  .  .  .  .  .  .  .  .  Obj: *ast.Object {
   181  .  .  .  .  .  .  .  .  .  Kind: var
   182  .  .  .  .  .  .  .  .  .  Name: "a"
   183  .  .  .  .  .  .  .  .  .  Decl: *(obj @ 175)
   184  .  .  .  .  .  .  .  .  }
   185  .  .  .  .  .  .  .  }
   186  .  .  .  .  .  .  }
   187  .  .  .  .  .  .  TokPos: 19:4
   188  .  .  .  .  .  .  Tok: :=
   189  .  .  .  .  .  .  Rhs: []ast.Expr (len = 1) {
   190  .  .  .  .  .  .  .  0: *ast.BasicLit {
   191  .  .  .  .  .  .  .  .  ValuePos: 19:7
   192  .  .  .  .  .  .  .  .  Kind: INT
   193  .  .  .  .  .  .  .  .  Value: "1"
   194  .  .  .  .  .  .  .  }
   195  .  .  .  .  .  .  }
   196  .  .  .  .  .  }
   197  .  .  .  .  }
   198  .  .  .  .  Rbrace: 20:1
   199  .  .  .  }
   200  .  .  }
   201  .  }
   202  .  Scope: *ast.Scope {
   203  .  .  Objects: map[string]*ast.Object (len = 3) {
   204  .  .  .  "Foo": *(obj @ 32)
   205  .  .  .  "Bar": *(obj @ 78)
   206  .  .  .  "main": *(obj @ 159)
   207  .  .  }
   208  .  }
   209  .  Imports: []*ast.ImportSpec (len = 1) {
   210  .  .  0: *(obj @ 12)
   211  .  }
   212  .  Unresolved: []*ast.Ident (len = 3) {
   213  .  .  0: *(obj @ 55)
   214  .  .  1: *(obj @ 119)
   215  .  .  2: *(obj @ 136)
   216  .  }
   217  }

4. AST树结构

// 该结构体位于标准包 go/ast/ast.go 中,有兴趣可以转跳到源码阅读更详尽的注释
type File struct {
	Doc        *CommentGroup   // 如果文件有文档,则文档会被存储在这个结构体中,否则为 nil
	Package    token.Pos       // "package"关键字,主要是所在的位置信息
	Name       *Ident          // package的名字
	Decls      []Decl          // 文件级别的声明。它包含文件中所有变量、函数、类型声明。如果文件中没有声明,则 decls 值为 nil
	Scope      *Scope          // 包级作用域。它代表包级作用域,包含所有在包内声明的变量和函数。它对当前文件有效
	Imports    []*ImportSpec   // imports in this file
	Unresolved []*Ident        // unresolved identifiers in this file。未使用的标识符
	Comments   []*CommentGroup // 文件中的所有注释。它包含文件中所有注释的列表
}

img

img

4.1. Doc

如果文件有文档,则文档会被存储在这个结构体中,否则为 nil

todo:目前没找到什么样的源代码解析成AST树后有Doc的

4.2. Package

*ast.File {
     1  .  Package: 1:1
     2  .  Name: *ast.Ident {
     3  .  .  NamePos: 1:9
     4  .  .  Name: "main"
     5  .  }

Package: 1:1, package关键字所在的位置

4.3. Name

img

type为ast.ident,表示它是一个变量值,可以看到内容为"main"

4.4. Decls

文件级别的声明。它包含文件中所有变量、函数、类型声明。如果文件中没有声明,则 decls 值为 nil

img

4.5. Decls总共有三种类型

img

4.5.1. BadDecl

语法出错的声明

4.5.2. GenDecl

常规的声明,包含以下部分

  • import
  • constant
  • type
  • variable
4.5.2.1. import

img

4.5.2.2. constant
4.5.2.3. type

img

4.5.2.4. variable

4.5.3. FunDecl

方法的声明

4.6. Scope

包级作用域。它代表包级作用域,包含所有在包内声明的变量和函数。它对当前文件有效

img

4.6.1. 示例如下

img

4.7. Imports

回顾以下File结构体定义,其中ImportsImportSpec类型数组

// 该结构体位于标准包 go/ast/ast.go 中,有兴趣可以转跳到源码阅读更详尽的注释
type File struct {
	Doc        *CommentGroup   // 如果文件有文档,则文档会被存储在这个结构体中,否则为 nil
	Package    token.Pos       // "package"关键字,主要是所在的位置信息
	Name       *Ident          // package的名字
	Decls      []Decl          // 文件级别的声明。它包含文件中所有变量、函数、类型声明。如果文件中没有声明,则 decls 值为 nil
	Scope      *Scope          // 包级作用域。它代表包级作用域,包含所有在包内声明的变量和函数。它对当前文件有效
	Imports    []*ImportSpec   // imports in this file
	Unresolved []*Ident        // unresolved identifiers in this file。未使用的标识符
	Comments   []*CommentGroup // 文件中的所有注释。它包含文件中所有注释的列表
}

ImportSpec结构体定义如下,一条import就是一个ImportSpec

// An ImportSpec node represents a single package import.
	ImportSpec struct {
		Doc     *CommentGroup // associated documentation; or nil
		Name    *Ident        // local package name (including "."); or nil
		Path    *BasicLit     // import path
		Comment *CommentGroup // line comments; or nil
		EndPos  token.Pos     // end of spec (overrides Path.Pos if nonzero)
	}

img

4.8. Unresolved

unresolved identifiers in this file。未使用的标识符

4.9. Comments

文件中的所有注释。它包含文件中所有注释的列表。实际上这块有问题,并没有注释解析出来

5. AST数节点类型

6. 参考资料

  1. Golang AST语法树使用教程及示例
  2. GoAst Viewer
  3. https://github.com/DrmagicE/ast-example
  4. [golang深入源代码系列之一:AST的遍历](

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/801854.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集线器、交换机、路由器的区别,冲突域、广播域

冲突域 定义:同一时间内只能有一台设备发送信息的范围。 分层:基于OSI模型的第一层物理层。 广播域 定义:如果某个站点发出一个广播信号,所有能接受到这个信号的设备的范围称为一个广播域。 分层:基于OSI模型的第二…

为ppt中的文字配色

文字的颜色来源于ppt不可删去的图像的颜色 从各类搜索网站中搜索ppt如何配色,有如下几点: 1.可以使用对比色,表示强调。 2.可以使用近似色,使得和谐统一。 3.最好一张ppt中,使用的颜色不超过三种主要颜色。 但我想强调…

第二证券:电影暑期档持续升温 农机自动驾驶驶入快车道

农机自动驾驶打开驶入快车道 得益于农机补贴、土地流通、高标准农田制造等方针引导,叠加技术突围和用户降本增效的内生需求,我国正处于农业2.0向农业3.0的过渡阶段。其间农机自动驾驶系统是结束农业3.0(即自动化)的要害并迎来快速…

【瑞吉外卖 | day07】移动端菜品展示、购物车、下单

文章目录 瑞吉外卖 — day71. 导入用户地址簿相关功能代码1.1 需求分析1.2 数据模型1.3 代码开发 2. 菜品展示2.1 需求分析2.2 代码开发 3. 购物车3.1 需求分析3.2 数据模型3.3 代码开发 4. 下单4.1 需求分析4.2 数据模型4.3 代码开发 瑞吉外卖 — day7 移动端相关业务功能 —…

Java实验4

实验内容 考试题 要求在一个界面内至少显示5道选择题,每道题4个选项。题目从数据库读取。表结构自定义。 另有2个命令按钮,分别为“重新答题”(全部选项及正确答题数清空)和“提交”(计算),在…

【芯片设计- RTL 数字逻辑设计入门 9.1 -- CRG模块】

请阅读【芯片设计 RTL 数字逻辑设计扫盲 】 转自:芯片设计基础 – CRG模块 文章目录 CRG模块CRG时钟系统CRG复位系统同步复位同步复位的优点同步复位的缺点 异步复位异步复位的优点异步复位的缺点 异步复位同步释放 CRG模块 CRG是芯片里的时钟和复位生成模块&#…

27.js实现鼠标拖拽

e.offsetX是鼠标距离准确事件源的左上角距离 e.clientX是鼠标距离浏览器可视窗口左上角的距离 e.pageX是鼠标距离文档左上角的距离 /* 当鼠标点击div时开始挪动,当鼠标抬起,div静止——事件源是div 当鼠标点击后,鼠标在移动——事件源…

Web开发:卡片翻转效果(HTML、CSS)

目录 一、实现效果 二、完整代码 三、实现过程 1、页面结构 2、初始样式 3、翻转效果 4、图片大小问题 一、实现效果 如下图所示,当鼠标移入某个盒子,就反转这个盒子,并显示其背面的内容——卡片翻转效果; 卡片翻转效果 二…

【STM32 IDE】使用STM32CubeIDE创建一个工程

关于IDE的下载安装和环境配置这里暂且不介绍,我们直接使用STM32F407ZGT6创建工程。 这里需要注意两点: 创建工程时,默认使用最新版本的固件包(HAL库),好像还不让更改。如果本地电脑位置没有该版本的包&…

webpack优化

优化方向 热更新 概念 /** hmr: hot module replacement 热模块替换 / 模块热更新作用: 一个模块发生改变,只会重新打包这一个模块(而不是打包所有模块),极大的提升了构建速度样式文件: 可以使用hmr功能…

防火墙-NAT策略和智能选路

一、背景技术 在日常网络环境,内部网络想要访问外网无法直接进行通信,这时候就需要进行NAT地址转换,而在防火墙上配置NAT和路由器上有点小区别,思路基本一致,这次主要就以防火防火墙配置NAT策略为例,防火墙…

【学习css3】使用flex和grid实现等高元素布局

过往的实现方法是使用浮动加计算布局来实现,当flex和grid问世时,这一切将变得简单起来 一、简单的两列实现 1、先看页面效果 2、css代码 .container {padding: 10px;width: 100ch;margin: 0 auto;box-shadow: inset 0 0 0 2px #ccc;}.column {margin: 2…

git clone 报错 Unable to negotiate

Unable to negotiate with 192.168.110.10 port 39418: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc fatal: Could not read from remote repository. 查询支持哪些加密算法 ssh -Q cipher 修改文件 /etc/ssh/ssh_config…

AR0132AT 1/3 英寸 CMOS 数字图像传感器(AR0132AT6R、AR0132AT6C)适用于监控和高清视频等多种应用

AR0132AT 1/3 英寸 CMOS 数字图像传感器,带 1280H x 960V 有效像素阵列。它能在线性或高动态模式下捕捉图像,且带有卷帘快门读取。它包含了多种复杂的摄像功能,如自动曝光控制、开窗,以及视频和单帧模式。它适用于低光度和高动态范…

基于AT89C51单片机构造波形发生器设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机构造波形发生器设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 摘要 仿真图 总体结构框图 仿真程序效果图 原理图 代码 系统论文(部分&…

Qcom平台通过Hexagon IDE 测试程序性能指导

Qcom平台通过Hexagon IDE 测试程序性能指导 1 安装Hexagon IDE工具2 测试工程2.1 打开Hexagon IDE2.2 新建工程2.3 添加测试案例2.3.1 方法一:新建2.3.2 方法二:拷贝 2.4 配置测试环境2.4.1 包含头文件2.4.2 添加程序优化功能(需先bulid一下)2.4.3 添加g…

【14】Github Copilot环境搭建

环境搭建 这里以Visual Studio Code为例,安装好vs code,打开扩展侧边菜单栏,搜索“Github Copilot”,会出现如下图的两个插件,点击安装第一个,另一个会附带一起安装,然后弹出提示重新启动vs co…

阿里云CDN- https(设计支付宝春节开奖业务)

HTTP相关概念 1. HTTP概述 http是最广泛的网络协议,是客户端与服务器之间的请求与应答的标准(TCP),用于www服务器传输超文本到本地浏览器的传输协议,使浏览器更加高效,网络传输减少。 2.HTTPS概述 http…

OpenHarmony移植之编译工具链

OpenHarmony移植之编译工具链 1、下载工具链 选择适合自己芯片的arm编译工具链,因为我的是arm cortex-a9的芯片,所以我选择如下交叉工具链 Downloads | GNU-A Downloads – Arm DeveloperDownload the The GNU Toolchain for the Cortex-A Family are…

稀疏3D检测-Sparse4Dv1v2v3

0. Multi-view 3D detection LSS(Lift-Splat-Shoot)利用深度估计将图像特征提升到3D空间,并将特征拍到BEV平面。后续工作将lift-splats操作应用于3D检测领域。 Bevformer将时序信息以BEV特征cat一起引入时序信息。 DETR3D中通过预测的3D点投影到图像平面后获取图像…