Go语言程序结构及常用命令 go语言 _
bigegpt 2024-10-29 12:57 4 浏览
go语言工作区
- 工作区是Go中的一个对应于特定工成的目录,其包括src、pkg、bin三个目录
- src:用于以代码包的形式组织并保存Go源码文件
- pkg:用于存放经由go install命令构建安装后的代码包(包括Go库源码文件)的".a"的归档文件
- bin:与pkg目录类似,在通过go install命令完成安装后,保存有Go命令源码文件生成的可执行文件
- 目录src用于包含所有的源代码,是Go命令工具的一个强制的规则,而pkg和bin则无需手动创建,如果必要Go命令行工具在构建过程中会自动创建这些目录
- 只要当环境变量GOPATH中只包含一个工作区的目录路径时,go install命令才会把命令源码安装到当前工作区的bin目录下。若环境变量GOPATH中包含多个工作区的目录路径,像这样执行go install命令就会失效,此时必须设置环境变量GOBIN
go install: no install location for .go files listed on command line (GOBINnot set
工作区如何设置(linux mac版)
工作区设置路径为环境变量中的GOPATH
#mac设置GOPAT
vim .bash_profile
export GOPATH=/Users/conyong/GoWork/Public:/Users/conyong/GoWork/Company
#Linux设置GOPATH
vim .bashrc
exportGOROOT=$HOME/go
exportPATH=$PATH:$GOROOT/bin
exportGOPATH=$HOME/workspace/go
exportPATH=$PATH:$GOPATH/bin
#Windows设置GOPATH
我的电脑-> 右击属性 -> 高级系统设置 -> 环境变量 -> 系统环境变量 -> 添加GOPATH
第一个Go程序
- Go语言源文件的扩展是.go
package main
import "fmt"
func main(){
fmt.Println("hello world!")
fmt.Println("golang")
}
编译过程
要执行Go语言代码可以使用命令或IDE来完成编译
- 编译命令:
go build hello.go
- 编译并运行命令:
go run hello.go
常用命令行
go help
- 获取对应命令的帮助文档,可以获取到对应命令的作用以及对应参数
go help build
go version
- 获取系统安装go语言版本号
go build
- 编译项目,使其打包成可运行程序,配合参数可以进行交叉编译
- 标准格式
- go build [-o output] [-i] [build flags] [packages]
- -o 参数决定了编译后文件名称,例如我们要程序main.go编译后程序名为hello,我们可以执行以下命令
go build -o hello main.go
- -i install 安装作为目标的依赖关系的包(用于增量编译提速),一般很少使用
- 编译参数一般并不会添加,以下举例几个,详细信息可以使用go help build获取
- packages
- 所编译的包名,如果不填写默认为编译当前路径下的入口文件,文件名称默认为当前文件夹命令
- 交叉编译
- go语言向下支持C语言,可以在go语言中直接编写C语言代码
- 但是在编译时,必须支持C语言
- Mac上编译Linux可执行二进制文件
CGO_ENABLED=0GOOS=linux GOARCH=amd64 go build main.go
- Mac上编译Windows可执行二进制文件
CGO_ENABLED=0GOOS=windows GOARCH=amd64 go build main.go
- Linux上编译Mac可执行二进制文件
CGO_ENABLED=0GOOS=darwin GOARCH=amd64 go build main.go
- Linux上编译Windows可执行二进制文件
CGO_ENABLED=0GOOS=windows GOARCH=amd64 go build main.go
- Windows上编译Mac可执行二进制文件
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go
- Windows上编译Linux可执行二进制文件
SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go
- 交叉编译参数含义
- CGO_ENABLED 是否使用cgo编译,0为不使用,1为使用,使用cgo进行交叉编译时需要编译机器安装对应的cgo程序
- GOOS 目标操作系统标识,windows对应windows操作系统exe可执行文件,darwin对应mac可执行文件,linux对应linux可执行文件,freebsd对应UNIX系统
- GOARCH目标可执行程序操作系统架构,包括386、amd64、arm
- go build 后接编译程序的入口文件
go install
- 编译并安装项目
- 标准格式
- go install [-i] [build flages] [packages]
- 参数与用法跟go build类似
go doc
- 获取go函数帮助文档
- 命令行形式获取某个包的介绍以及包下所有可用的公共方法列表
go doc strconv
- 命令形式获取某个方法的文档
go doc strconv.Itoa
- 使用网页形式查看帮助文档
godoc -http=localhost:6060
- 查看当前系统内go相关的环境变量信息
go env
- Go语言自带的测试工具,会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件
go test
- 原则
- 文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应代码
- 必须import testing这个包
- 可执行测试
- 原则
- 所有的测试用例函数必须是Test开头
- 测试用例会按照源代码中写的顺序依次执行
- 测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态
- 测试格式: func TestXxx(t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不能是小写字母
- 函数中通过调用testing.T的Error,Errorf,FailNow,Fatal,Fatalif方法,说明测试不通过,调用Log方法来记录测试的信息
- 创建测试文件class_test.go
package main
import (
"testing"
"time"
)
func TestHelloWorld(t *testing.T){
timestamp := time.Now().Unix()
t.Log(timestamp)
}
- 执行命令行查看测试结果
go test -v class_test.gp
- 结果
- === RUN TestHelloWorld 表示开始运行名叫 TestHelloWorld 的测试用例
- --- PASS: TestHelloWorld (0.00s) 表示已经运行完 TestHelloWorld 的测试用例, PASS 表示当前方法测试成功,如果是FAIL 表示当前方法测试失败,时间表示这个 测试用例所使用的时间
- ok command-line-arguments 0.005s 表示整体测试结果,ok 表示所有被测试 方法测试通过,如果是FAIL则表示测试失败,command-line-arguments 是测试 用例需要用到的一个包名,0.005s 表示测试花费的时间。
=== RUN TestHelloWorld --- PASS: TestHelloWorld (0.00s) class_test.go:10: 1571237717 PASS ok command-line-arguments 0.005s
5. Go语言关键字
?
关键字使用方式
- var
- 定义变量
// 用于声明变量,声明方式包括以下几种 var name1 int64 var name2 = 15 // 在func内可以使用简写等价,但是简写不可用于声明全局变量,不能在func外面使用 name3 := 15 name4,name5,name6 := "a","b","c" // 同时赋值改多个变量
- const
- 定义常量或常量集
//用于声明常量,可以不用声明类型,对于int类型的常量可以用于int,int64等计算
package main
import "fmt"
const a = 14
func main(){
var b = 16
var c = int64(20)
d := a + b
e := a + c
fmt.Println("d",d)
fmt.Println("e",e)
}
- package
- 用于包声明,在go中包的概念一般指同一个文件夹下的文件,与其它部分语言每个文件可以自己就是一个包不同,包命可以与文件夹名称不同,但是一般建议响应(如果文件夹带有版本号情况可以忽略版本号部分),需要写的程序的可执行文件的第一步 // 这里是注释 package main
- import
- 用于包的引用,引用路径为工作区下的相对路径,如果程序内引用了两个不同路径下相同包名,可以通过设定别名的方式进行区分,如果程序内需要用到引用包的初始化或者接口实现,但是没有显示调用,则需要使用_来进行区分
package main
import (
"context"
echoContext "echo/context"
_ "notuse/context"
)
func main(){
context.Background()
echoContext.text()
}
- func/return
- 定义函数接收返回值
- func
- 函数方法体声明
- 返回参数如果为一个且不带参数名,可以不用写括号
- 返回参数超过一个或者带参数名需要用括号括起来
- return
- 函数方法体返回
- 如果函数返回参数带有参数名称则返回时不需要将每一个参数显示返回,否则血压显示返回
package main
// 无入参,无出参
func main(){
demo1("hello")
demo2("hello",1,2,3)
intArr := []int64{1,2,3}
demo2("hello",intArr...)
demo3()
demo4()
demo5()
demo6()
}
// 有固定入参,无出参数
func demo1(name string){
return
}
// 无固定入参,无出参数
func demo2(name string, params ...int64){
return
}
// 无入参,单参数无名称
func demo3() int64{
return 0
}
// 无入参,单参数有名称
func demo4() (age int64){
return
}
// 无入参,多参数无名称
func demo5() (int64,string){
return 0,""
}
// 无入参,多参数有名称
func demo6() (age int64,name string){
return
}
相关推荐
- 悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)
-
新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...
- 高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源
-
凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...
- 微服务架构实战:商家管理后台与sso设计,SSO客户端设计
-
SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...
- 还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑
-
在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...
- Seata源码—6.Seata AT模式的数据源代理二
-
大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...
- 30分钟了解K8S(30分钟了解微积分)
-
微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
-
一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...
- 一招解决所有依赖冲突(克服依赖)
-
背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...
- 你读过Mybatis的源码?说说它用到了几种设计模式
-
学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...
- golang对接阿里云私有Bucket上传图片、授权访问图片
-
1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...
- spring中的资源的加载(spring加载原理)
-
最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...
- Android资源使用(android资源文件)
-
Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...
- 如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)
-
深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...
- @Autowired与@Resource原理知识点详解
-
springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...
- java的redis连接工具篇(java redis client)
-
在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)