当前位置: 首页 > news >正文

开发php网站建设做网站外包公司

开发php网站建设,做网站外包公司,短剧小程序开发,商务网站开发课程体会Go的执行原理以及Go的命令 一、Go的源码文件 Go 的源码文件分类#xff1a; 如上图#xff0c;分为三类#xff1a; 1、命令源码文件#xff1a; 声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。 命令源码文件被安装以后#xff0c;GOPATH 如果…Go的执行原理以及Go的命令 一、Go的源码文件 Go 的源码文件分类 如上图分为三类 1、命令源码文件 声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。 命令源码文件被安装以后GOPATH 如果只有一个工作区那么相应的可执行文件会被存放当前工作区的 bin 文件夹下如果有多个工作区就会安装到 GOBIN 指向的目录下。 命令源码文件是 Go 程序的入口。 同一个代码包中最好也不要放多个命令源码文件。多个命令源码文件虽然可以分开单独 go run 运行起来但是无法通过 go build 和 go install 多个命令源码文件虽然可以分开单独 go run 运行起来但是无法通过 go build 和 go install。 同理如果命令源码文件和库源码文件也会出现这样的问题库源码文件不能通过 go build 和 go install 这种常规的方法编译和安装。 所以命令源码文件应该是被单独放在一个代码包中。 2、库源码文件 库源码文件就是不具备命令源码文件上述两个特征的源码文件。存在于某个代码包中的普通的源码文件。 库源码文件被安装后相应的归档文件.a 文件会被存放到当前工作区的 pkg 的平台相关目录下。 3、测试源码文件 名称以 _test.go 为后缀的代码文件并且必须包含 Test 或者 Benchmark 名称前缀的函数 func TestXXX( t *testing.T) {}名称以 Test 为名称前缀的函数只能接受 *testing.T 的参数这种测试函数是功能测试函数。 func BenchmarkXXX( b *testing.B) {} 名称以 Benchmark 为名称前缀的函数只能接受 *testing.B 的参数这种测试函数是性能测试函数。 命令源码文件是可以单独运行的。可以使用 go run 命令直接运行也可以通过 go build 或 go install 命令得到相应的可执行文件。所以命令源码文件是可以在机器的任何目录下运行的。 举个栗子 比如平时我们在 LeetCode 上刷算法题这时候写的就是一个程序这就是命令源码文件可以在电脑的任意一个文件夹新建一个 go 文件就可以开始刷题了写完就可以运行对比执行结果答案对了就可以提交代码。 但是公司项目里面的代码就不能这样了只能存放在 GOPATH 目录下。因为公司项目不可能只有命令源码文件的肯定是包含库源码文件甚至包含测试源码文件的。 二、Go的命令 目前Go的最新版1.12里面基本命令有以下17个。 我们可以打开终端输入go help即可看到Go的这些命令以及简介。 bug start a bug reportbuild compile packages and dependenciesclean remove object files and cached filesdoc show documentation for package or symbolenv print Go environment informationfix update packages to use new APIsfmt gofmt (reformat) package sourcesgenerate generate Go files by processing sourceget download and install packages and dependenciesinstall compile and install packages and dependencieslist list packages or modulesmod module maintenancerun compile and run Go programtest test packagestool run specified go toolversion print Go versionvet report likely mistakes in packages其中和编译相关的有build、get、install、run这4个。接下来就依次看看这四个的作用。 在详细分析这4个命令之前先罗列一下通用的命令标记以下这些命令都可适用的 名称说明-a用于强制重新编译所有涉及的 Go 语言代码包包括 Go 语言标准库中的代码包即使它们已经是最新的了。该标记可以让我们有机会通过改动底层的代码包做一些实验。-n使命令仅打印其执行过程中用到的所有命令而不去真正执行它们。如果不只想查看或者验证命令的执行过程而不想改变任何东西使用它正好合适。-race用于检测并报告指定 Go 语言程序中存在的数据竞争问题。当用 Go 语言编写并发程序的时候这是很重要的检测手段之一。-v用于打印命令执行过程中涉及的代码包。这一定包括我们指定的目标代码包并且有时还会包括该代码包直接或间接依赖的那些代码包。这会让你知道哪些代码包被执行过了。-work用于打印命令执行时生成和使用的临时工作目录的名字且命令执行完成后不删除它。这个目录下的文件可能会对你有用也可以从侧面了解命令的执行过程。如果不添加此标记那么临时工作目录会在命令执行完毕前删除。-x使命令打印其执行过程中用到的所有命令并同时执行它们。 1. go run 专门用来运行命令源码文件的命令注意这个命令不是用来运行所有 Go 的源码文件的 go run 命令只能接受一个命令源码文件以及若干个库源码文件必须同属于 main 包作为文件参数且不能接受测试源码文件。它在执行时会检查源码文件的类型。如果参数中有多个或者没有命令源码文件那么 go run 命令就只会打印错误提示信息并退出而不会继续执行。 这个命令具体干了些什么事情呢来分析分析我们先重新创建一个新文件mytest.go并加入以下代码 package main import fmt func main(){fmt.Println(HelloWorld)fmt.Println(你好Go!!!) }执行go run 配合-n localhost:hello ruby$ go run -n mytest.go # # command-line-arguments #mkdir -p $WORK\b001\ cat $WORK\b001\importcfg.link EOF # internal packagefile command-line-argumentsC:\Users\86183\AppData\Local\go-build\da\daf89c759da51c828c245206031b23c24b461abd573b7fb2eaab89178ff157bc-d 此处略去 EOF mkdir -p $WORK\b001\exe\ cd . D:\\Software\\go\\pkg\\tool\\windows_amd64\\link.exe -o $WORK\\b001\\exe\\helloword.exe -importcfg $WORK\\b001\\importcfg.link -s -w -buildmodepie -buildidNg9lGUTOQoGV2eXbj3Oa/GWhJBJEI08g5eqcy-OTN/3mSGcyLLGTGTb1rmyFpC/Ng9lGUTOQoGV2eXbj3Oa -extldgcc C:\\Users\\86183\\AppData\\Local\\go-build\\da\\daf89c759da51c828c245206031b23c24b461abd573b7fb2eaab89178ff157bc-d $WORK\b001\exe\helloword.exe 这里可以看到创建了两个临时文件夹 b001 和 exe先执行了 compile 命令然后 link生成了归档文件.a 和 最终可执行文件最终的可执行文件放在 exe 文件夹里面。命令的最后一步就是执行了可执行文件。 总结一下如下图 举个例子生成的临时文件可以用go run -work看到比如当前生成的临时文件夹是如下的路径 E:\学习\go语言学习\codego run -work helloword.go WORKC:\Users\86183\AppData\Local\Temp\go-build4138937823 HellowWorld!我们进入C:\Users\86183\AppData\Local\Temp\go-build4138937823目录可以看到如下目录结构 可以看到最终go run命令是生成了2个文件一个是归档文件一个是可执行文件。 go run 命令在第二次执行的时候如果发现导入的代码包没有发生变化那么 go run 不会再次编译这个导入的代码包。直接静态链接进来。 mkdir -p $WORK\b001\ cat $WORK\b001\importcfg.link EOF # internal 此处略去 EOF mkdir -p $WORK\b001\exe\ cd . D:\\Software\\go\\pkg\\tool\\windows_amd64\\link.exe -o $WORK\\b001\\exe\\helloword.exe -importcfg $WORK\\b001\\importcfg.link -s -w -buildmodepie -buildidNg9lGUTOQoGV2eXbj3Oa/GWhJBJEI08g5eqcy-OTN/3mSGcyLLGTGTb1rmyFpC/Ng9lGUTOQoGV2eXbj3Oa -extldgcc C:\\Users\\86183\\AppData\\Local\\go-build\\da\\daf89c759da51c828c245206031b23c24b461abd573b7fb2eaab89178ff157bc-d $WORK\b001\exe\helloword.exe 2. go build go build 命令主要是用于测试编译。在包的编译过程中若有必要会同时编译与之相关联的包。 如果是普通包当你执行go build命令后不会产生任何文件。如果是main包当只执行go build命令后会在当前目录下生成一个可执行文件。如果需要在$GOPATH/bin目录下生成相应的exe文件需要执行go install 或者使用 go build -o 路径/可执行文件。如果某个文件夹下有多个文件而你只想编译其中某一个文件可以在 go build 之后加上文件名例如 go build a.gogo build 命令默认会编译当前目录下的所有go文件。你也可以指定编译输出的文件名。比如我们可以指定go build -o 可执行文件名默认情况是你的package名(非main包)或者是第一个源文件的文件名(main包)。go build 会忽略目录下以”_”或者”.”开头的go文件。如果你的源代码针对不同的操作系统需要不同的处理那么你可以根据不同的操作系统后缀来命名文件。 当代码包中有且仅有一个命令源码文件的时候在文件夹所在目录中执行 go build 命令会在该目录下生成一个与目录同名的可执行文件。 // 假设当前文件夹名叫 hello localhost:hello ruby$ pwd /Users/ruby/go/src/hello localhost:hello ruby$ ls helloworld.go localhost:hello ruby$ go build localhost:hello ruby$ ls hello helloworld.go于是在当前目录直接生成了以当前文件夹为名的可执行文件 在 Mac 平台下是 Unix executable 文件在 Windows 平台下是 exe 文件 但是这种情况下如果使用 go install 命令如果 GOPATH 里面只有一个工作区就会在当前工作区的 bin 目录下生成相应的可执行文件。如果 GOPATH 下有多个工作区则是在 GOBIN 下生成对应的可执行文件。 localhost:hello ruby$ go install go install hello: open /usr/local/go/bin/hello: permission denied localhost:hello ruby$ 这个问题是因为它需要创建bin目录然后把可刚才的可执行文件放进去而目前我们在gopath下还没有bin目录那么就需要先创建这个文件而普通用户没有直接创建文件夹的权限这个和Go语言的命令是没有关系的。我们可以加上sodu 来执行这个命令表示使用管理员的身份执行然后输入密码那么就可以创建bin这个文件夹了。 再次执行 localhost:hello ruby$ sudo go install Password: localhost:hello ruby$ 执行完 go install 会发现可执行文件不见了去哪里了呢其实是被移动到了 bin 目录下了如果 GOPATH 下有多个工作区就会放在GOBIN 目录下。 查看目录 那 go build 和 go install 究竟干了些什么呢 先来说说 go build。go build 用于编译我们指定的源码文件或代码包以及它们的依赖包。但是注意如果用来编译非命令源码文件即库源码文件go build 执行完是不会产生任何结果的。这种情况下go build 命令只是检查库源码文件的有效性只会做检查性的编译而不会输出任何结果文件。 go build 编译命令源码文件则会在该命令的执行目录中生成一个可执行文件上面的例子也印证了这个过程。 go build 后面不追加目录路径的话它就把当前目录作为代码包并进行编译。go build 命令后面如果跟了代码包导入路径作为参数那么该代码包及其依赖都会被编译。 go build 命令究竟做了些什么呢我们可以执行-n这个命令来查看 localhost:hello ruby$ go build -n# # hello #mkdir -p $WORK/b001/ cat $WORK/b001/importcfg EOF # internal # import config packagefile fmt/usr/local/go/pkg/darwin_amd64/fmt.a packagefile runtime/usr/local/go/pkg/darwin_amd64/runtime.a EOF cd /Users/ruby/go/src/hello /usr/local/go/pkg/tool/darwin_amd64/compile -o $WORK/b001/_pkg_.a -trimpath $WORK/b001 -p main -complete -buildid PXDetO1R1NhLFMK5QGUc/PXDetO1R1NhLFMK5QGUc -goversion go1.12.1 -D -importcfg $WORK/b001/importcfg -pack -c4 ./helloworld.go /usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/_pkg_.a # internal cat $WORK/b001/importcfg.link EOF # internal packagefile hello$WORK/b001/_pkg_.a ... EOF mkdir -p $WORK/b001/exe/ cd . /usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmodeexe -buildiddiTh1q6kcbGRIX3aj3mU/PXDetO1R1NhLFMK5QGUc/PXDetO1R1NhLFMK5QGUc/diTh1q6kcbGRIX3aj3mU -extldclang $WORK/b001/_pkg_.a /usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/exe/a.out # internal mv $WORK/b001/exe/a.out hello localhost:hello ruby$ 可以看到执行过程和 go run 大体相同唯一不同的就是在最后一步go run 是执行了可执行文件但是 go build 命令只是把库源码文件编译了一遍然后把可执行文件移动到了当前目录的文件夹中。 总结一下如下图 3. go install go install 命令是用来编译并安装代码包或者源码文件的。 go install 命令在内部实际上分成了两步操作第一步是生成结果文件(可执行文件或者.a包)第二步会把编译好的结果移到$GOPATH/pkg或者​$GOPATH/bin。 可执行文件 一般是 go install 带main函数的go文件产生的有函数入口所有可以直接运行。 .a应用包 一般是 go install 不包含main函数的go文件产生的没有函数入口只能被调用。 go install 用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时该命令会先去处理依赖包。与 go build 命令一样传给 go install 命令的代码包参数应该以导入路径的形式提供。并且go build 命令的绝大多数标记也都可以用于 实际上go install 命令只比 go build 命令多做了一件事即安装编译后的结果文件到指定目录。 安装代码包会在当前工作区的 pkg 的平台相关目录下生成归档文件即 .a 文件。 安装命令源码文件会在当前工作区的 bin 目录如果 GOPATH 下有多个工作区就会放在 GOBIN 目录下生成可执行文件。 同样go install 命令如果后面不追加任何参数它会把当前目录作为代码包并安装。这和 go build 命令是完全一样的。 go install 命令后面如果跟了代码包导入路径作为参数那么该代码包及其依赖都会被安装。 go install 命令后面如果跟了命令源码文件以及相关库源码文件作为参数的话只有这些文件会被编译并安装。 go install 命令究竟做了些什么呢 localhost:hello ruby$ go install -n# # hello #mkdir -p $WORK/b001/ cat $WORK/b001/importcfg EOF # internal # import config packagefile fmt/usr/local/go/pkg/darwin_amd64/fmt.a packagefile runtime/usr/local/go/pkg/darwin_amd64/runtime.a EOF cd /Users/ruby/go/src/hello /usr/local/go/pkg/tool/darwin_amd64/compile -o $WORK/b001/_pkg_.a -trimpath $WORK/b001 -p main -complete -buildid E1CTs4eXkD5M28s_FQXT/E1CTs4eXkD5M28s_FQXT -goversion go1.12.1 -D -importcfg $WORK/b001/importcfg -pack -c4 ./helloworld.go /usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/_pkg_.a # internal cat $WORK/b001/importcfg.link EOF # internal packagefile hello$WORK/b001/_pkg_.a packagefile fmt/usr/local/go/pkg/darwin_amd64/fmt.a ... EOF mkdir -p $WORK/b001/exe/ cd . /usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmodeexe -buildidFJ6kJTmN9rcWcwLhqfiQ/E1CTs4eXkD5M28s_FQXT/E1CTs4eXkD5M28s_FQXT/FJ6kJTmN9rcWcwLhqfiQ -extldclang $WORK/b001/_pkg_.a /usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/exe/a.out # internal mkdir -p /usr/local/go/bin/ mv $WORK/b001/exe/a.out /usr/local/go/bin/hello localhost:hello ruby$ 前面几步依旧和 go run 、go build 完全一致只是最后一步的差别go install 会把命令源码文件安装到当前工作区的 bin 目录如果 GOPATH 下有多个工作区就会放在 GOBIN 目录下。如果是库源码文件就会被安装到当前工作区的 pkg 的平台相关目录下。 总结一下如下图 在安装多个库源码文件时有可能遇到如下的问题 localhost:hello ruby$ go install envir.go fpath.go ipath.go pnode.go util.go go install: no install location for .go files listed on command line (GOBIN not set)而且在我们为环境变量 GOBIN 设置了正确的值之后这个错误提示信息仍然会出现。这是因为只有在安装命令源码文件的时候命令程序才会将环境变量 GOBIN 的值作为结果文件的存放目录。而在安装库源码文件时在命令程序内部的代表结果文件存放目录路径的那个变量不会被赋值。最后命令程序会发现它依然是个无效的空值。所以命令程序会同样返回一个关于“无安装位置”的错误。这就引出一个结论我们只能使用安装代码包的方式来安装库源码文件而不能在 go install 命令罗列并安装它们。另外go install 命令目前无法接受标记-o以自定义结果文件的存放位置。这也从侧面说明了 go install 命令不支持针对库源码文件的安装操作。 4. go get go get 命令用于从远程代码仓库比如 Github 上下载并安装代码包。注意go get 命令会把当前的代码包下载到 $GOPATH 中的第一个工作区的 src 目录中并安装。 使用 go get 下载第三方包的时候依旧会下载到 $GOPATH 的第一个工作空间而非 vendor 目录。当前工作链中并没有真正意义上的包依赖管理不过好在有不少第三方工具可选。 如果在 go get 下载过程中加入-d 标记那么下载操作只会执行下载动作而不执行安装动作。比如有些非常特殊的代码包在安装过程中需要有特殊的处理所以我们需要先下载下来所以就会用到-d 标记。 还有一个很有用的标记是-u标记加上它可以利用网络来更新已有的代码包及其依赖包。如果已经下载过一个代码包但是这个代码包又有更新了那么这时候可以直接用-u标记来更新本地的对应的代码包。如果不加这个-u标记执行 go get 一个已有的代码包会发现命令什么都不执行。只有加了-u标记命令会去执行 git pull 命令拉取最新的代码包的最新版本下载并安装。 命令 go get 还有一个很值得称道的功能——智能下载。在使用它检出或更新代码包之后它会寻找与本地已安装 Go 语言的版本号相对应的标签tag或分支branch。比如本机安装 Go 语言的版本是1.x那么 go get 命令会在该代码包的远程仓库中寻找名为 “go1” 的标签或者分支。如果找到指定的标签或者分支则将本地代码包的版本切换到此标签或者分支。如果没有找到指定的标签或者分支则将本地代码包的版本切换到主干的最新版本。 go get 常用的一些标记如下 标记名称标记描述-d让命令程序只执行下载动作而不执行安装动作。-f仅在使用-u标记时才有效。该标记会让命令程序忽略掉对已下载代码包的导入路径的检查。如果下载并安装的代码包所属的项目是你从别人那里 Fork 过来的那么这样做就尤为重要了。-fix让命令程序在下载代码包后先执行修正动作而后再进行编译和安装。-insecure允许命令程序使用非安全的 scheme如 HTTP 去下载指定的代码包。如果你用的代码仓库如公司内部的 Gitlab 没有HTTPS 支持可以添加此标记。请在确定安全的情况下使用它。-t让命令程序同时下载并安装指定的代码包中的测试源码文件中依赖的代码包。-u让命令利用网络来更新已有代码包及其依赖包。默认情况下该命令只会从网络上下载本地不存在的代码包而不会更新已有的代码包。 go get 命令究竟做了些什么呢我们还是来打印一下每一步的执行过程。 localhost:hello ruby$ go get -x github.com/go-errors/errors cd . git clone https://github.com/go-errors/errors /Users/ruby/go/src/github.com/go-errors/errors cd /Users/ruby/go/src/github.com/go-errors/errors git submodule update --init --recursive cd /Users/ruby/go/src/github.com/go-errors/errors git show-ref cd /Users/ruby/go/src/github.com/go-errors/errors git submodule update --init --recursive WORK/var/folders/kt/nlhsnpgn6lgd_q16f8j83sbh0000gn/T/go-build188558329 localhost:hello ruby$ 效果图 这里可以很明显的看到执行完 go get 命令以后会调用 git clone 方法下载源码并编译最终会把库源码文件编译成归档文件安装到 pkg 对应的相关平台目录下。 总结一下如下图 5. 其他命令 go clean go clean 命令是用来移除当前源码包里面编译生成的文件这些文件包括 _obj/ 旧的object目录由Makefiles遗留_test/ 旧的test目录由Makefiles遗留_testmain.go 旧的gotest文件由Makefiles遗留test.out 旧的test记录由Makefiles遗留build.out 旧的test记录由Makefiles遗留*.[568ao] object文件由Makefiles遗留DIR(.exe) 由 go build 产生DIR.test(.exe) 由 go test -c 产生MAINFILE(.exe) 由 go build MAINFILE.go产生 go fmt go fmt 命令主要是用来帮你格式化所写好的代码文件。 比如我们写了一个格式很糟糕的 test.go 文件我们只需要使用 fmt go test.go 命令就可以让go帮我们格式化我们的代码文件。但是我们一般很少使用这个命令因为我们的开发工具一般都带有保存时自动格式化功能这个功能底层其实就是调用了 go fmt 命令而已。 使用go fmt命令更多时候是用gofmt而且需要参数-w否则格式化结果不会写入文件。gofmt -w src可以格式化整个项目。 go test go test 命令会自动读取源码目录下面名为*_test.go的文件生成并运行测试用的可执行文件。默认的情况下不需要任何的参数它会自动把你源码包下面所有test文件测试完毕当然你也可以带上参数详情请参考go help testflag go doc go doc 命令其实就是一个很强大的文档工具。 如何查看相应package的文档呢 例如builtin包那么执行go doc builtin如果是http包那么执行go doc net/http查看某一个包里面的函数那么执行go doc fmt Printf也可以查看相应的代码执行go doc -src fmt Printf # 查看net/http包 localhost:hello ruby$ go doc net/http # 查看time包 localhost:hello ruby$ go doc time # 查看某个包里的指定函数 localhost:hello ruby$ go doc fmt Printf安装doc go install -v golang.org/x/tools/cmd/godoclatest #上面安装超时执行下面换源后再安装 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct # 配置阿里云通过命令在命令行执行 go doc -http:端口号比如godoc -http:8080。然后在浏览器中打开127.0.0.1:8080你将会看到一个golang.org的本地copy版本通过它你可以查询pkg文档等其它内容。如果你设置了GOPATH在pkg分类下不但会列出标准包的文档还会列出你本地GOPATH中所有项目的相关文档这对于经常被限制访问的用户来说是一个不错的选择。 localhost:hello ruby$ godoc -http:8081go fix 用来修复以前老版本的代码到新版本例如go1之前老版本的代码转化到go1 go version 查看go当前的版本 go env 查看当前go的环境变量 go list 列出当前全部安装的package
http://www.hkea.cn/news/14406353/

相关文章:

  • 如何得知网站有没有做推广网站建设有什么出路
  • 网站建设费是几个点的税北京网站推广|网站制作|网络推广|网站建设
  • 网站建设 中国移动9377网页游戏排行榜
  • 注册或者浏览社交类网站时不恰当网站模版 之星
  • 网站建设模块分析yy陪玩网站怎么做
  • 博客网站推荐安防公司网站建设
  • 社保局网站建设意义宠物商品销售网站开发背景
  • 医院网站前置审批最快多久出来上海企业网络推广公司
  • 公司网站建设款计什么科目怎么把自己做的网站让别人收到
  • 国办网站建设要求中关村在线app下载
  • 十大素材网站黄冈市建设局官方网站
  • 企业网站的建设与维护网站建设公司做销售好不好
  • 曲阜市网站建设wordpress修改code标签
  • 做app一定要做网站吗企业网站制作建设的框架有哪几种
  • 合肥网站建设是什么意思网站设计师培训
  • 网站建设公司如何运营新手做网站视频
  • 网站开发话题贵阳网站建设推广公司
  • 如何建网站做传奇网友中国做网站找谁
  • 营销型网站的缺点文案素材网站
  • 怎样清理网站后门西安传媒公司
  • 灰色链网站建设wordpress多国语言设置
  • 高端网站建设郑州橄榄树网站建设
  • 做商城网站企业导柱导套网站建设
  • 网络运维基础知识seo技术分类
  • 购物网站产品做促销能赚钱吗眉山网站制作
  • 鹤山做网站网站内容页相关性怎么做
  • 全椒县建设局网站张店网站制作首选专家
  • 建网站源码建站详解南京制作网页设计
  • 外贸网站建设优化营销公众号关键词点歌
  • 济宁网站建设公司怎么样腾讯会议收费