Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go语言学习(三):源码文件

go语言学习(三):源码文件

作者头像
jinjunzhu
发布于 2020-08-20 02:05:25
发布于 2020-08-20 02:05:25
45600
代码可运行
举报
文章被收录于专栏:个人开发个人开发
运行总次数:0
代码可运行

go语言的源码文件包括命令源码文件、库源码文件和测试源码文件。

命令源码文件是程序执行的入口,属于main包,包含无参数无返回结果的main函数,同java类似,同一个包下面不建议存放多个main函数。命令源码文件编译或安装后生成可执行文件,存在当前执行命令的目录下。

库源码文件用于存放供其他代码使用的程序实体,构建时进行检查和验证,生成临时文件,安装时生成归档文件,存放在当前工作区的pkg目录。

测试源码文件主要存放测试相关的源码文件,包括功能测试、性能测试、程序运行示例等。

下面详细讲一下命令源码文件和库源码文件:

1.命令源码文件

1)代码1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Demo1.gopackage main
import "fmt"func main() {  fmt.Print("hollo world!")}

如上代码,我们在IDE中执行run操作,或者在命令行执行go run Demo1.go

2)命令源码文件怎么接受参数呢?go语言中的fla代码包专门用于接受和解析命令行参数,如下面代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main
import (  "flag"  "fmt")
var name string
func init(){  flag.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {  flag.Parse()  fmt.Printf("hollo, %s!\n", name)}

上面的代码中,flag.StringVar中有四个参数,分别是命令行参数地址,命令行参数名称,默认输出值,参数说明,在调用命令行参数之前必须对其解析,如上面flag.parse

3)自定义命令源码文件的参数使用说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main
import (  "flag"  "fmt"  "os")
var name string
func init(){  flag.CommandLine = flag.NewFlagSet("", flag.PanicOnError)  flag.CommandLine.Usage = func() {    fmt.Fprintf(os.Stderr, "Usage of %s:\n", "question")    flag.PrintDefaults()  }  flag.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {  flag.Parse()  fmt.Printf("hollo, %s!\n", name)}

上面的PanicOnError是其中类型,总共有3种error类型,看下面源码定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const (  ContinueOnError ErrorHandling = iota // Return a descriptive error.  ExitOnError                          // Call os.Exit(2).  PanicOnError                         // Call panic with a descriptive error.)

执行命令和结果见下图:

4)自定义命令参数容器,可以更加灵活地定义命令行参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main
import (  "flag"  "fmt"  "os")
var name string
var cmdLine = flag.NewFlagSet("question", flag.ExitOnError)func init(){  cmdLine.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {  cmdLine.Parse(os.Args[1:])  fmt.Printf("hollo, %s!\n", name)}

2.库源码文件

库源码文件是不能直接运行的文件,只能被其他程序使用。go语言中,如果当前文件要使用某个文件中声明的函数,需要跟这个文件在同一个包下面。

看下面2段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Demo6.go
package mainimport "fmt"//定义方法func printHello(name string) {  fmt.Printf("Hello, %s!\n", name)}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Demo5.gopackage main
import (  "flag"  "os")
var name string
var cmdLine = flag.NewFlagSet("question", flag.ExitOnError)func init(){  cmdLine.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {  cmdLine.Parse(os.Args[1:])  printHello(name)}

运行如下命令:

注意上面的命令,是同时运行Demo5和Demo6。还有一种方式就是把这2个文件放到一个包下,编译后执行。目录结构如下:

在命令行执行go build demo1,会产生demo1.exe文件,然后运行这个可执行文件,输出:"Hello, everyone!",如下图:

注意:

a)工作目录mygolang一定要配置到GOPATH环境变量中,否则会报下图错误;

b) 同一包下面的源码文件要声明同一个代码包。如果包下面有命令源码文件,那其他种类的源码文件也要声明为所属main包。

c)源码文件的代码包声明可以跟所在目录不一样,但是如果build一个代码包,产生的结果同代码包名称相同。如上面的示例

配置好环境变量:

d)如果修改包目录结构,如下图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Demo6.gopackage lib
import "fmt"
//定义方法func PrintHello(name string) {  fmt.Printf("Print Hello, %s!\n", name)}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Demo5.gopackage main
import (  "demo2/lib"  "flag"  "os")
var name string
var cmdLine = flag.NewFlagSet("question", flag.ExitOnError)func init(){  cmdLine.StringVar(&name, "name", "everyone", "The greeting object.")}func main() {  cmdLine.Parse(os.Args[1:])  lib.PrintHello(name)}

这种情况下,Demo5.go要依赖Demo6.go的文件,需要先安装一下lib包,go install demo2\lib

这时候就会生成一个归档文件,接着编译和运行

e)在上面Demo6.go中的程序实体改为了大写,这样就可以被包外的程序引用,如果是小写,只能被包内的程序引用。

f)go语言支持package声明和所在目录不同,但是为了让代码清晰不产生误会,建议这2个名称保持一致

g)在一个模块中声明internal的代码包,可以仅让当前代码包中使用,包括internal代码包的直接父包和子包,不支持其他模块中的代码包引用。

代码地址:https://github.com/jinjunzhu/mygolang.git

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 jinjunzhu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go语言核心36讲(Go语言基础知识二)--学习笔记
我们已经知道,环境变量 GOPATH 指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件。
郑子铭
2021/10/13
3610
Go语言核心36讲(Go语言基础知识二)--学习笔记
命令源码文件
定义:命令源码文件是程序的原型入口,是每个可独立运行的程序必须拥有的,我们可以通过构建和安装生成对应的可执行文件,后者一般与该命令源码文件的直接父目录同名
酷走天涯
2019/06/11
7550
命令源码文件
从源码的角度看Go语言flag库如何解析命令行参数!
我上周五喝酒喝到晚上3点多,确实有点罩不住啊,整个周末都在休息和睡觉,文章鸽了几天,想不到就有两个人跑了。
机智的程序员小熊
2021/08/12
8270
golang flag包使用笔记
https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter13/13.1.html
我的小碗汤
2018/08/22
1.5K0
golang flag包使用笔记
【Golang】命令源码文件
命令源码文件是程序的运行入口,是每个可独立运行的程 序必须拥有的。我们可以通过构建或安装,生成与其对应的可执行文件,后者一般会与该命令源码文件的直接父目录同名。 如果一个源码文件声明属于main包,并且包含一个无参数声明且无结果声明的main函数,那么它就是命令源码文件。
MaybeHC
2024/04/23
1820
【Golang】命令源码文件
GO 每日一库之1:flag
我一直在想,有什么方式可以让人比较轻易地保持每日学习,持续输出的状态。写博客是一种方式,但不是每天都有想写的,值得写的东西。
luckpunk
2023/09/09
3200
用 Go 构建一个区块链 -- Part 3: 持久化和命令行接口
翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了。如果想直接运行代码,也可以 clone GitHub 上的教程仓库,进入 src 目录执行 make 即可。
用户1558438
2018/08/23
4770
Go实战 | 让flag支持从文件中读取命令行参数
golang标准库提供了flag包来处理命令行参数。常规的使用都是在命令行中启动服务的时候一一的输入,让程序解析。今天给大家介绍一种可以从文件中读取命令行参数的实现方法。
Go学堂
2023/01/31
1.4K0
Go语言核心36讲(Go语言基础知识四)--学习笔记
还记得吗?Go 语言中的程序实体包括变量、常量、函数、结构体和接口。 Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予足够的信息,这样才可以让 Go 语言能够推导出它们的类型。
郑子铭
2021/10/14
3480
Go语言核心36讲(Go语言基础知识四)--学习笔记
​​区块链持久化--golang实现区块链系列之三
本篇使用boltdb的简易数据库将区块链的数据持久化到一个文件中。boltdb是kv形式保存的。 下面代码:
若与
2018/10/12
6140
​​区块链持久化--golang实现区块链系列之三
Go 命令行解析 flag 包之通过子命令实现看 go 命令源码
正式介绍子命令的实现之前,先了解下 flag 包中的一个类型,FlagSet,它表示了一个命令。
波罗学
2019/12/02
1.2K0
教你打造最简比特币之持久化
开发环境:Go语言 本教程是学习Jeiwan的博客后的学习笔记,代码实现也参考它的为主,精简了叙述并在适当位置添加了一些必备的小知识和适当的代码注释,如介绍哈希。 本教程是为了逐步教你设计一款简化的区块链原型币。通过我们不断添加功能,完成一个可交易的原型币。 本节我们增加持久化的功能,可以持久化区块链到本地文件。 单机版,仅支持保存信息✅ 工作量证明✅ 持久化 选择数据库 目前,我们的原型币是存储在内存里的,每次运行结束后消失。而真正的比特币账本是需要持久化保存到本地的,比特币的核心开发者们,选择的是 Le
linxinzhe
2018/04/10
9150
一篇文章带你搞定Go语言中flag包使用
Hey,大家好,我是码农,星期八,这次来讲一下的Go语言中,比较常用的一个包flag包。
Go进阶者
2021/03/08
1K0
一篇文章带你搞定Go语言中flag包使用
1.Go语言之标准库学习记录(1)
描述: 我们进行Go语言编程之中当遇到不熟悉的内置函数时, 可以采用go doc builtin [builtinFunName]查看go语言内置函数。
全栈工程师修炼指南
2022/09/29
1.1K0
1.Go语言之标准库学习记录(1)
Golang之文件读写
读写文件,不添加文件路径,默认写入到GOPATH路径下 终端读写: 源码 func Sscanf func Sscanf(str string, format string, a ...interface{}) (n int, err error) 解释:Sscanf scans the argument string, storing successive space-separated values into successive arguments as determined by the form
超蛋lhy
2018/08/31
1.2K0
Golang之文件读写
Golang开发命令行工具之flag包的使用
日常命令行操作,相对应的众多命令行工具是提高生产力的必备工具,我在之前的文章我的生产力工具推荐-终端01篇中有推荐过一些我常用的基于terminal终端的命令行cli工具
仙人技术
2021/10/13
8920
Go语言核心36讲(Go语言实战与应用一)--学习笔记
在接下来的日子里,我将带你去学习在 Go 语言编程进阶的道路上,必须掌握的附加知识,比如:Go 程序测试、程序监测,以及 Go 语言标准库中各种常用代码包的正确用法。
郑子铭
2021/11/11
6260
Go语言核心36讲(Go语言实战与应用一)--学习笔记
Go语言核心36讲(Go语言基础知识三)--学习笔记
在我的定义中,库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从 Go 语言规范的话)。
郑子铭
2021/10/14
5610
Go语言核心36讲(Go语言基础知识三)--学习笔记
GoLang读写数据---中
注意 defer 的使用:当打开dst文件时发生了错误,那么 defer 仍然能够确保 src.Close() 执行。如果不这么做,src文件会一直保持打开状态并占用资源。
大忽悠爱学习
2022/08/23
4030
GoLang读写数据---中
使用 AI 辅助开发一个开源 IP 信息查询工具:二
在上一篇文章《使用 AI 辅助开发一个开源 IP 信息查询工具:一[1]》中,我们已经将初版代码推送到了开源项目 soulteary/ip-helper[2]。
soulteary
2024/12/23
1620
使用 AI 辅助开发一个开源 IP 信息查询工具:二
推荐阅读
相关推荐
Go语言核心36讲(Go语言基础知识二)--学习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验