东莞建设网站的位置,张家港做网站优化排名,线上营销话术,网站制作方案设计目录
包#xff08;package#xff09;是组织和复用代码的基本单元。
包的种类#xff1a;
包的导入
包的组成
如下两个文件中定义了A变量和 sc_num变量#xff0c;他们的首字母开头分别为大写和小写#xff0c;因此可以说明A变量是公有变量#xff0c;而sc_num是私…目录
包package是组织和复用代码的基本单元。
包的种类
包的导入
包的组成
如下两个文件中定义了A变量和 sc_num变量他们的首字母开头分别为大写和小写因此可以说明A变量是公有变量而sc_num是私有变量。
go 风格指南
go中的Init函数
如何导入第三方包
1、查看go的配置变量基本信息
2、开启GOMODULE管理方式默认GO111MODULEauto
3、启用国内下载代理
4、创建go.mod文件
编辑5、安装第三方包
go第三方安装包下载官网Go Packages - Go Packages
6、导入实验代码
7、运行程序
8、测试Web服务
如何在linux上运行该go语言Web服务器
1、首先安装go语言环境
2、如果版本太低了就需要卸载原来的go版本安装新的go版本而这则需要源码安装
3、源码安装go
4、部署Web服务
5、运行go语言程序
6、测试Web服务效果
go的切片与数组详细的数据传输解释go传递数据的时候使用的是传值的方式
切片类型下数据的传递方式
数组类型下数据的传递方式
什么是传值和传地址他们的区别又是什么
传值和传址的区别总结如下
如何在go的函数中直接修改原数据的数组呢而不是修改函数副本空间中的复制的数组呢
如果输入数据超过切片的容量限制会发生什么呢
go的文件操作文件的读写方式
什么时候会用到go中的文件读写呀 包package是组织和复用代码的基本单元。
一个包可以包含多个Go源文件以.go为扩展名这些文件通常属于同一个功能或领域。每个源文件的开头都需要声明所属的包名。
包名 --》告知当前这个go文件属于哪个包目录
go文件 --》定义包中的内容代码写在go文件中 --》main --》这是一个主运行文件
包的种类 标准库包Standard Library PackagesGo标准库提供了丰富的包来支持各种常见任务和功能如字符串处理、文件操作、网络通信等。这些包无需额外安装可以直接使用。内置包不需要安装、直接import导入即可使用 第三方包Third-Party PackagesGo社区拥有众多的第三方包以满足各种特定需求。这些包通常由其他开发者或组织维护并且需要使用工具如Go Modules或GOPATH来管理和导入。第三方包需要安装再导入使用 自定义包Custom Packages任何人都可以创建自己的Go包并根据需要组织和导出函数、类型和变量。自定义包使代码更易于重用和维护。可以通过在代码文件的开头使用package关键字声明包名并使用import语句在其他代码中导入自定义包。自定义包自己写的go包 包的导入 // import sc/user 直接导入包的内容 // import u sc/user 导入之后取别名 // import _ sc/user 仅执行init函数中的内容 // import . sc/user 导入包中所有的内容 包的组成
一个目录表示一个包(sanchuang)、user子包 代码写到go文件中 第一行声明当前文件属于当个包建议包名与目录名同名 同一个包下的文件声明的包名应该一致同一个包中变量、函数等都是共享的相互可见的文件中定义的对象 》大写的标识符 表示Public , 小写的标识符表示Private 以大写字母开头的标识符如变量名函数名都是表示Public 以小写字母开头的标识符都是表示Private 如下两个文件中定义了A变量和 sc_num变量他们的首字母开头分别为大写和小写因此可以说明A变量是公有变量而sc_num是私有变量。 main文件
package main// import 包名/子包名
// 取别名 有时候有些包的名字特别长.可以取别名
//u sc/user
// 仅仅执行sc/user包中的初始化信息
//_ sc/user
//. sc/user
// 注意事项:包名与目录名不一致必须取一个别名 sc/user 路径
//import (
// fmt
// sc/user
//)
import fmt
import u sc/userfunc main(){fmt.Printf(start.....)//TeacherInfo()user.TeacherInfo()//u.TeacherInfo()//TeacherInfo()变量大写字母开头小写字母开头大写字母开头的变量Public//fmt.Println(user.A)// 小写字母开头私有的不能使用//fmt.Println(user.sc_num)
}// init函数 初始化一些变量/数据的时候使用
func init(){fmt.Println(main init1)
}
func init(){fmt.Println(main init2)
}go 风格指南 // 包名 小写单数 // 文件名 小写下划线 // 函数、结构体、接口、...:大驼峰 UserName // 变量名 小驼峰 userName go中的Init函数
init 函数是一种特殊的函数初始化函数它在程序运行时自动执行而不需要显式调用。
init 函数有以下特点 init 函数没有参数和返回值。一个包中可以定义多个init一个文件中也可以定义多个init当一个程序运行时首先会按照包的导入顺序初始化包级别的变量和常量。然后在完成包级别的变量和常量初始化后会按照导入顺序依次执行每个包中的 init 函数。如果一个包中有多个 init 函数它们的执行顺序与定义顺序相同。 当包被导入的时候init函数自动执行 init 函数通常用于执行一些初始化操作例如注册驱动、初始化全局变量、设置配置信息等。它可以提供程序运行前的一些准备工作。
下面是一个示例展示了 init 函数的使用
package mainimport (fmt
)var a intfunc init() {fmt.Println(初始化 a 变量)a 10
}func main() {fmt.Println(main 函数执行)fmt.Println(a , a)
}
在上面的例子中init 函数用来初始化变量 a。当程序运行时先执行 init 函数然后再执行 main 函数。输出结果为
初始化 a 变量 main 函数执行 a 10
需要注意的是init 函数在程序中只会执行一次无论包被导入多少次。而且它不可以被其他函数调用或引用。
如何导入第三方包
1、查看go的配置变量基本信息
go env --》查看go的配置变量信息D:\衡山-开发\GO\Day_01\2023-07-21-go模块与包\sanchuanggo env
set GO111MODULEauto #用于控制Go Modules模块的行为
set GOARCHamd64
set GOBIN
set GOCACHEC:\Users\23843\AppData\Local\go-build
set GOENVC:\Users\23843\AppData\Roaming\go\env
set GOEXE.exe
set GOEXPERIMENT
set GOFLAGS
set GOHOSTARCHamd64
set GOHOSTOSwindows
set GOINSECURE
set GOMODCACHEC:\Users\23843\go\pkg\mod
set GONOPROXY
set GONOSUMDB
set GOOSwindows
set GOPATHC:\Users\23843\go #指定Go语言工作区的根目录被用来指定存放Go源代码、编译后二进制文件和第三方包的位置。三方的依赖都安装到$GOPATH/pkg/mod目录下
set GOPRIVATE
set GOPROXYhttps://goproxy.cn,direct #设置Go模块的代理服务器默认情况下Go模块会从官方的代理服务器 https://proxy.golang.org 下载模块的依赖包但是我们需要修改为国内源direct直接从源地址下载依赖包不通过代理服务器。
set GOROOTE:\Go #指定Go语言的安装路径包含了Go语言的标准库和工具$GOROOT\src:go的标准模块存储的地方
set GOSUMDBsum.golang.org
set GOTMPDIR
set GOTOOLDIRE:\Go\pkg\tool\windows_amd64
set GOVCS
set GOVERSIONgo1.19.2
set GCCGOgccgo
set GOAMD64v1
set ARar
set CCgcc
set CXXg
set CGO_ENABLED1
set GOMODD:\衡山-开发\GO\Day_01\2023-07-21-go模块与包\sanchuang\go.mod
set GOWORK
set CGO_CFLAGS-g -O2
set CGO_CPPFLAGS
set CGO_CXXFLAGS-g -O2
set CGO_FFLAGS-g -O2
set CGO_LDFLAGS-g -O2
set PKG_CONFIGpkg-config
set GOGCCFLAGS-m64 -mthreads -Wl,--no-gc-sections -fmessage-length0 -fdebug-prefix-mapC:\Users\23843\AppData\Local\Temp\go-build3093873577
/tmp/go-build -gno-record-gcc-switchesD:\衡山-开发\GO\Day_01\2023-07-21-go模块与包\sanchuangGO MODULES是自Go 1.11版本引入的官方依赖管理工具用于管理Go项目中的包版本和依赖关系。它解决了早期Go语言项目中对于第三方包的管理问题。
功能依赖管理、版本选择、自动拉取、代理服务器支持、私有仓库支持 使用Go Modules的基本步骤如下 初始化模块在项目根目录下执行go mod init 《项目名》命令可以创建一个新的go.mod文件来初始化模块。 导入依赖包通过import语句导入所需的依赖包。Go Modules会自动检测并下载缺失的依赖包。 构建和运行使用go build命令构建项目并使用go run命令运行项目。 管理依赖可以使用go get命令来添加、更新或删除依赖包。Go Modules会自动更新go.mod文件和下载相应的包。 版本控制可以在go.mod文件中指定所需的包版本使用正确的语义版本控制规则。 因此我们创建的包中必须包含一个go.mod文件下面的步骤都是在你的项目地址下进行的
D:\衡山-开发\GO\Day_01\2023-07-21-go模块与包\MyWeb
2、开启GOMODULE管理方式默认GO111MODULEauto
go env -w GO111MODULEon
3、启用国内下载代理
go env -w GOPROXYhttps://goproxy.cn,direct
4、创建go.mod文件
go mod init web
5、安装第三方包
单个依赖安装
go get github.com/gin-gonic/gin
整体项目依赖的处理
go mod tidygo第三方安装包下载官网Go Packages - Go Packages
6、导入实验代码
package main//server.go是主运行文件
import (github.com/gin-gonic/ginnet/http
)
//gin是go中的一个Web框架// 入口函数
func main(){// 创建一个web服务器r : gin.Default()// 当访问/sc 返回{message:hello sanchang}r.GET(/sc, func(c *gin.Context){// 200,c.JSON(http.StatusOK, gin.H{message: hello, sanchuang,})})// 运行web服务r.Run()
} 7、运行程序
运行项目
go run server.go
8、测试Web服务
访问网址http://127.0.0.1:8080/sc 如何在linux上运行该go语言Web服务器
1、首先安装go语言环境
[rootmaster ~]# yum install golang -y2、如果版本太低了就需要卸载原来的go版本安装新的go版本而这则需要源码安装
卸载软件
yum remove go -y
源码卸载rm -rf /usr/local/go
3、源码安装go
首先找到go的安装包
路径All releases - The Go Programming Language (google.cn)
我们需要安装go 1.19.11版本的安装包
wget https://golang.google.cn/dl/go1.19.11.linux-amd64.tar.gz 解压安装包
[rootmaster ~]# tar -zxf go1.19.11.linux-amd64.tar.gz 配置环境变量
[rootmaster ~]# vim ~/.bashrc#添加下面3条
GOROOT/usr/local/go
export GOPATH~/go
export PATH$PATH:$GOPATH:$GOROOT/bin#重新加载环境
[rootmaster ~]# source ~/.bashrc
[rootmaster ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/scnginx66/sbin:/usr/local/scnginx66/sbin:/root/go:/usr/local/go/bin移动go程序到/usr/local/ 目录下并查看go版本
[rootmaster ~]# mv go /usr/local/
[rootmaster ~]# ls /usr/local/go/bin
go gofmt
[rootmaster ~]# go version
go version go1.19.11 linux/amd64
[rootmaster ~]# 4、部署Web服务
首先创建server.go文件存放go语言Web程序
[rootmaster ~]# cd /
[rootmaster /]# mkdir myweb
[rootmaster /]# cd myweb/
[rootmaster myweb]# vim server.go
[rootmaster myweb]# ls
server.go
[rootmaster myweb]# cat server.go
package main//server.go是主运行文件
import (github.com/gin-gonic/ginnet/http
)
//gin是go中的一个Web框架// 入口函数
func main(){// 创建一个web服务器r : gin.Default()// 当访问/sc 返回{message:hello sanchang}r.GET(/sc, func(c *gin.Context){// 200,c.JSON(http.StatusOK, gin.H{message: hello, sanchuang,})})// 运行web服务r.Run()
}
[rootmaster myweb]# 对go语言模块进行初始化生成go.mod文件
[rootmaster myweb]# go mod init web
go: creating new go.mod: module web
go: to add module requirements and sums:go mod tidy
[rootmaster myweb]# ls
go.mod server.go
[rootmaster myweb]# 下面对go语言模块进行加载
[rootmaster myweb]# go mod tidy发现如下错误
[rootmaster myweb]# go mod tidy
go: finding module for package github.com/gin-gonic/gin
web importsgithub.com/gin-gonic/gin: module github.com/gin-gonic/gin: Get https://proxy.golang.org/github.com/gin-gonic/gin/v/list: dial tcp 172.217.160.113:443: i/o timeout
[rootmaster myweb]# 是安装超时了我们需要将它的源更改为国内源
[rootmaster myweb]# go env -w GO111MODULEon
[rootmaster myweb]# go env -w GOPROXYhttps://goproxy.cn,direct安装成功
[rootmaster myweb]# go mod tidy
go: finding module for package github.com/gin-gonic/gin
go: downloading github.com/gin-gonic/gin v1.9.1
go: found github.com/gin-gonic/gin in github.com/gin-gonic/gin v1.9.1
go: downloading github.com/gin-contrib/sse v0.1.0
go: downloading github.com/mattn/go-isatty v0.0.19
go: downloading golang.org/x/net v0.10.0
go: downloading github.com/stretchr/testify v1.8.3
go: downloading google.golang.org/protobuf v1.30.0
go: downloading github.com/go-playground/validator/v10 v10.14.0
go: downloading github.com/pelletier/go-toml/v2 v2.0.8
go: downloading github.com/ugorji/go/codec v1.2.11
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading github.com/bytedance/sonic v1.9.1
go: downloading github.com/goccy/go-json v0.10.2
go: downloading github.com/json-iterator/go v1.1.12
go: downloading golang.org/x/sys v0.8.0
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/gabriel-vasile/mimetype v1.4.2
go: downloading github.com/go-playground/universal-translator v0.18.1
go: downloading github.com/leodido/go-urn v1.2.4
go: downloading golang.org/x/crypto v0.9.0
go: downloading golang.org/x/text v0.9.0
go: downloading github.com/go-playground/locales v0.14.1
go: downloading github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
go: downloading github.com/modern-go/reflect2 v1.0.2
go: downloading github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311
go: downloading golang.org/x/arch v0.3.0
go: downloading github.com/twitchyliquid64/golang-asm v0.15.1
go: downloading github.com/klauspost/cpuid/v2 v2.2.4
go: downloading github.com/go-playground/assert/v2 v2.2.0
go: downloading github.com/google/go-cmp v0.5.5
go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
go: downloading golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
[rootmaster myweb]# 5、运行go语言程序
[rootmaster myweb]# go run server.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in debug mode. Switch to release mode in production.- using env: export GIN_MODErelease- using code: gin.SetMode(gin.ReleaseMode)[GIN-debug] GET /sc -- main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :80806、测试Web服务效果 go的切片与数组详细的数据传输解释go传递数据的时候使用的是传值的方式
package mainimport fmt// 切片是一种引用类型存放的是地址func main(){
// 定义了一个切片 len 0, cap 10
var sli make([]int, 0, 10)
fmt.Printf(原始sli:%v, %p, %p\n,sli, sli, sli)
test(sli)
fmt.Printf(执行test后sli:%v\n,sli)
// sli[0:cap]
fmt.Printf(执行sli[:10]:%v\n,sli[:10])
}func test(sli []int){
fmt.Printf(函数中sli:%v, %p, %p\n,sli, sli, sli)
// 将切片追加数据
sli append(sli,10,20,30)
fmt.Printf(函数中的结果是%v\n,sli)
}
输出的结果是
原始sli:[], 0xc000008078, 0xc00001e140
函数中sli:[], 0xc0000080c0, 0xc00001e140 #源sli和函数中的副本sli的地址是不一样的但是里面的第一个数据的地址是一样的说明go分配给切片的方式是传值传递引用这才会导致两个不同空间指向的数据中的地址都是一样的
函数中的结果是[10 20 30] #在test中运行go分配空间给test函数中的sli使用
执行test后sli:[] #test执行后go收回分配给test函数的空间导致不存在test中的sli切片了
执行sli[:10]:[10 20 30 0 0 0 0 0 0 0] #原因是在test中他给副本的sli切片添加了数值而副本的sli的数据的地址空间与源sli数据的地址空间是一样的所以才导致源地址空间的sli切片的数据发生了改变这里复制的是sli这个切片类型在函数中复制的切片s发生了变化外面的sl没有改变但是他们底层的数组发生了变化数组没有被复制还是用的同一个吧
Process finished with exit code 0切片类型下数据的传递方式 数组类型下数据的传递方式 什么是传值和传地址他们的区别又是什么
传值go语言当使用传值方式将参数传递给函数时函数会创建该参数的一个副本并在函数内部使用该副本进行操作。这意味着对参数进行的任何修改都只会影响到该副本不会影响原始的参数。传值方式适用于简单的数据类型如整数、浮点数、布尔值或者在函数内部不需要修改原始参数的情况。
传地址python语言当使用传地址方式将参数传递给函数时实际上是将参数的内存地址传递给函数。这样在函数内部可以直接访问和修改原始参数的值。因为是直接操作原始参数所以对参数的修改会影响到原始参数的值。传地址方式适用于复杂的数据类型如数组、切片、映射、结构体或者需要在函数内部修改原始参数的情况。
传值和传址的区别总结如下 传值是将参数的副本传递给函数对副本的任何修改都不会影响原始参数。传地址是将参数的内存地址传递给函数允许直接访问和修改原始参数。传值适用于简单的数据类型或者不需要修改原始参数的情况。传地址适用于复杂的数据类型或者需要在函数内部修改原始参数的情况。 如何在go的函数中直接修改原数据的数组呢而不是修改函数副本空间中的复制的数组呢 go语言中,当调用一个函数的时候函数的每个调用参数将会被赋值给函数内部的参数变量所以函数参数变量接收的是一个复制的副本并不是原始调用的变量。 因为函数参数传递的机制导致传递大的数组类型将是低效的并且对数组参数的任何的修改都是发生在复制的数组上并不能直接修改调用时原始的数组变量。 我们可以显式地传入一个数组指针那样的话函数通过指针对数组的任何修改都可以直接反馈到调用者。 如果输入数据超过切片的容量限制会发生什么呢
定义了一个切片slice变量 sli长度为 0容量为 3如果输入数据超过容量限制会直接创建一个新的底层数组 因为我们定义的切片只有3个容量但是我们需要输入4个容量的数据因此函数中的sli切片会定义另外一个底层数组用来存储数据与源地址空间的sli切片的底层数组不同这导致源地址空间的sli切片的底层数组并没有存储数据而数据是保存在了函数中副本空间内的sli切片定义的新的底层数组空间中。 go的文件操作文件的读写方式
package mainimport (bufiofmtos
)func main() {// 获取当前路径防止创建文件的时候不知道文件被创建的路径在哪里wd, err : os.Getwd()if err ! nil{ //异常处理fmt.Println(获取当前路径失败, err)}fmt.Println(当前路径为:, wd)// 在当前目录filePath : ./golang.txtfile,err : os.OpenFile(filePath,os.O_CREATE|os.O_WRONLY, 0666)// go对于错误的错误权交给了用户if err!nil{ //异常处理fmt.Println(打开文件失败, err)return}// 如果打开文件没有出错// defer延迟执行如果程序遇到panic也会执行defer file.Close() //异常处理//写入数据write : bufio.NewWriter(file)for i:0;i5;i{write.WriteString(hello sc\n)}//因为我们写入的数据是在缓存中我们需要写道磁盘中因此需要对数据进行一个强刷将数据保存到磁盘文件当中write.Flush()
}
结果为 什么时候会用到go中的文件读写呀
爬虫图片、文件
写日志 --》 日志模块