自己做网站视频,asp做网站很少,正规seo关键词排名网络公司,阿里云网站空间购买作者简介#xff1a; 高科#xff0c;先后在 IBM PlatformComputing从事网格计算#xff0c;淘米网#xff0c;网易从事游戏服务器开发#xff0c;拥有丰富的C#xff0c;go等语言开发经验#xff0c;mysql#xff0c;mongo#xff0c;redis等数据库#xff0c;设计模…作者简介 高科先后在 IBM PlatformComputing从事网格计算淘米网网易从事游戏服务器开发拥有丰富的Cgo等语言开发经验mysqlmongoredis等数据库设计模式和网络库开发经验对战棋类回合制moba类页游手游有丰富的架构设计和开发经验。 谢谢你的关注
-------------------------------------------------------------------------------------------------------------------------------- 这一节给大家来分享下作用域包package的作用用法以及相关代码示例前面十几篇讲了很基础的go的语法也用到了一些作用域和包package但发现自始自终都还没有给大家分享他们的作用怎么用那么这一篇文章相信会给大家一个很好的解释和学习机会。
为什么作用域和包很重要
包和作用域在 Go 中至关重要原因如下
封装作用域控制变量和函数的可见性促进封装并防止意外访问。模块化包有助于将代码组织成可管理的单元从而更轻松地构建和维护项目。命名空间每个包都有自己的命名空间这意味着您可以在不同的包中使用相同的标识符名称而不会发生冲突。可重用性库包可以在不同的项目中重用节省时间和精力。
1 作用域 在 Golang 中作用域是指可以访问已定义变量或函数的程序区域。它对于控制变量和函数的可见性和生命周期至关重要。在Go语言中变量的作用域取决于它们的声明位置。根据声明的位置可以将变量的作用域分为以下几种情况 全局作用域在函数外部声明的变量具有全局作用域可以在任何函数内部访问。 函数作用域在函数内部声明的变量具有函数作用域只能在该函数内部访问。 块作用域在if语句、for循环等块结构内部声明的变量具有块作用域只能在该块内部访问。
var globalVariable int // 全局变量func myFunc () { localVariable : 2 // 局部变量// 使用 localVariable 做一些事情}
在不同作用域内变量的可见性不同。在内部作用域中内部变量可以访问外部作用域中的变量。而在外部作用域中不能直接访问内部作用域中的变量。因此你可以在myFunc里使用globalVariable这个全局变量但是你不能在全局作用域下使用局部变量localVariable
因此假设你真想这样做你会收到这样的报错信息 另外对于函数参数中声明的变量它们的作用域也是函数作用域。只能在该函数内部访问。
在代码中直观可见的显式的(explicit)code block比如函数的函数体、for循环的循环体等还有隐式的(implicit)code block。 下面的代码综合了几种作用域的情况很容易混淆。请各位仔细琢磨弄清楚。
package mainimport fmtvar (globalV int 100
) func GetFunc() func() int {if globalV : 55; globalV 60 {fmt.Println(GetFunc if 中, globalV)}for globalV : 2; ; {fmt.Println(GetFunc 循环中, globalV)break}fmt.Println(GetFunc 函数中全局变量, globalV)return func() int {globalV 1return globalV}
}func main() {fmt.Println(main函数中全局变量, globalV)globalV : stringfmt.Println(main函数中局部变量, globalV)b : GetFunc()fmt.Println(main函数中, b(), b(), b(), b()){globalV : 2fmt.Println(globalV){globalV : 3fmt.Println(globalV)}}fmt.Println(globalV)
}程序输出 globalV作为全局变量纯在是int类型值为100因此在main函数的第一个打印实际上是打印的全局变量值100接下来globalV通过简式声明 : 操作是string类型值为string。在main()中v很典型地体现了在“{}”花括号中的作用域问题每一层花括号都是对上一层的屏蔽。而闭包函数GetGa()返回的匿名函数赋值给b每次执行b()Ga的值都被记忆在内存中下次执行b()的时候取b()上次执行后Ga的值而不是全局变量Ga的值这就是闭包函数可以使用包含它的函数内的变量因为作为代码块一直存在所以每次执行都是在上次基础上运行。
简单总结如下
有花括号{ }一般都存在作用域的划分 : 简式声明会屏蔽所有上层代码块中的变量常量建议使用规则来规范如对常量使用全部大写而变量尽量小写 在if等语句中存在隐式代码块需要注意 闭包函数可以理解为一个代码块并且他可使用包含它的函数内的变量 注意简式变量只能在函数内部声明使用但是它可能会覆盖函数外全局同名变量。而且你不能在一个单独的声明中重复声明一个变量但在多变量声明中这是允许的而且其中至少要有一个新的声明变量。重复变量需要在相同的代码块内否则你将得到一个隐藏变量。 如果你在代码块中犯了这个错误将不会出现编译错误但应用运行结果可能不是你所期望。所以尽可能避免和全局变量同名。 思考
func main() {if a : 1; false {} else if b : 2; false {} else if c : 3; false {} else {println(a, b, c)}
}这段代码运行结果是什么你能写出来吗 包Package
Go语言使用包package的概念来组织管理代码包是结构化代码的一种方式。在Go语言中每个.go文件都必须归属于某一个包每个文件都可有init()函数。包名在源文件中第一行通过关键字package指定包名要小写。如下所示
package fmt每个目录下面可以有多个.go文件这些文件只能属于同一个包否则编译时会报错。同一个包下的不同.go文件相互之间可以直接引用变量和函数所以这些文件中定义的全局变量和函数不能重名。
如果你使用某个包中的某个成员就必须import 包名。有两种方式单行汇导入和多行导入 // 单行导入 import fmt import math // 多行导入 import ( fmt math ) 如果在一个包中想要访问另一个包的成员就像变数、函式、结构等就必须导出成员export 的方法即将成员名称设置为大写。
package mypkg
var myVar 100 // 只能在 mypkg 中使用
const MyConst hello // 可以在 mypkg 外部使用 Go语言的可执行应用程序必须有main包而且在main包中必须且只能有一个main()函数main()函数是应用程序运行开始入口。在main包中也可以使用init()函数。
Go语言不强制要求包的名称和文件所在目录名称相同但是这两者最好保持相同否则很容易引起歧义。因为导入包的时候会使用目录名作为包的路径而在代码中使用时却要使用包的名称。
包的导入
一个Go程序通过import关键字将一组包链接在一起。import其实是导入目录而不是定义的包名称实际应用中我们一般都会保持一致。
例如标准包中定义的big包package bigimport math/big 源代码其实是在GOROOT下src中的src/math/big目录。在代码中使用big.Int时big指的才是.go文件中定义的包名称。
当导入多个包时一般按照字母顺序排列包名称像LiteIDE会在保存文件时自动完成这个动作。所谓导入包即等同于包含了这个包的所有的代码对象。
为避免名称冲突同一包中所有对象的标识符必须要求唯一。但是相同的标识符可以在不同的包中使用因为可以使用包名来区分它们。
import语句一般放在包名定义的下一行导入包示例如下
package mainimport context //加载context包导入多个包的常见的方式是
import (
fmt
net/http)调用导入的包函数的一般方式
fmt.Println(Hello World!)下面介绍三种特殊的import方式。
点操作的含义是某个包导入之后在调用这个包的函数时可以省略前缀的包名如这里可以写成Println(Hello World!)而不是fmt.Println(Hello World!)。例如
import( . fmt )别名操作就是可以把包命名成另一个容易记忆的名字。例如
import(f fmt
)别名操作调用包函数时前缀变成了别名即f.Println(Hello World!)。在实际项目中有时这样使用但请谨慎使用不要不加节制地采用这种形式。
_ 操作是引入某个包但不直接使用包里的函数而是调用该包里面的init函数比如下面的mysql包的导入。此外在开发中由于某种原因某个原来导入的包现在不再使用也可以采用这种方式处理比如下面fmt的包。代码示例如下
import (_ fmt_ github.com/go-sql-driver/mysql
)标准包
在 Go 的安装文件里包含了一些可以直接使用的标准包。在$GOROOT/src中可以看到源码也可以根据情况自行重新编译。
完整列表可以访问GoWalkerhttps://gowalker.org/查看。 unsafe: 包含了一些打破 Go 语言“类型安全”的命令一般的程序中不会被使用可用在 C/C 程序的调用中。 syscall-os-os/exec: os: 提供给我们一个平台无关性的操作系统功能接口采用类Unix设计隐藏了不同操作系统间差异让不同的文件系统和操作系统对象表现一致。 os/exec: 提供我们运行外部操作系统命令和程序的方式。 syscall: 底层的外部包提供了操作系统底层调用的基本接口。 archive/tar 和 /zip-compress压缩(解压缩)文件功能。 fmt-io-bufio-path/filepath-flag: fmt: 提供了格式化输入输出功能。 io: 提供了基本输入输出功能大多数是围绕系统功能的封装。 bufio: 缓冲输入输出功能的封装。 path/filepath: 用来操作在当前系统中的目标文件名路径。 flag: 对命令行参数的操作。 strings-strconv-unicode-regexp-bytes: strings: 提供对字符串的操作。 strconv: 提供将字符串转换为基础类型的功能。 unicode: 为 unicode 型的字符串提供特殊的功能。 regexp: 正则表达式功能。 bytes: 提供对字符型分片的操作。 math-math/cmath-math/big-math/rand-sort: math: 基本的数学函数。 math/cmath: 对复数的操作。 math/rand: 伪随机数生成。 sort: 为数组排序和自定义集合。 math/big: 大数的实现和计算。 container-/list-ring-heap: 实现对集合的操作。 list: 双链表。 ring: 环形链表。 time-log: time: 日期和时间的基本操作。 log: 记录程序运行时产生的日志。 encoding/Json-encoding/xml-text/template: encoding/Json: 读取并解码和写入并编码 Json 数据。 encoding/xml:简单的 XML1.0 解析器。 text/template:生成像 HTML 一样的数据与文本混合的数据驱动模板。 net-net/http-html: net: 网络数据的基本操作。 http: 提供了一个可扩展的 HTTP 服务器和客户端解析 HTTP 请求和回复。 html: HTML5 解析器。 runtime: Go 程序运行时的交互操作例如垃圾回收和协程创建。 reflect: 实现通过程序运行时反射让程序操作任意类型的变量。 从 GitHub 安装包
如果有人想安装您的远端项目到本地机器打开终端并执行ffhelicopter是我在 GitHub 上的用户名
go get -u go.mongodb.org/mongo-driver/mongo这样现在这台机器上的其他 Go 应用程序也可以通过导入路径go.mongodb.org/mongo-driver/mongo 来使用。
import go.mongodb.org/mongo-driver/mongoGo 对包的版本管理做的不是很友好不过现在有些第三方项目做的不错有兴趣的同学可以了解下glide、godep、govendor。
导入外部安装包
如果你要在你的应用中使用一个或多个外部包你可以使用 Go install在你的本地机器上安装它们。Go install 是 Go 中自动包安装工具如需要将包安装到本地它会从远端仓库下载包检出、编译和安装一气呵成。
在包安装前的先决条件是要自动处理包自身依赖关系的安装。被依赖的包也会安装到子目录下但是没有文档和示例可以到网上浏览。
Go install 使用了 GoPATH 变量
假设你想使用GitHub - gocolly/colly: Elegant Scraper and Crawler Framework for Golang 这种托管在 Google Code、GitHub 和 Launchpad 等代码网站上的包。
你可以通过如下命令安装 Go install github.com/gocolly/colly 将一个名为 github.com/gocolly/colly 安装在$GoPATH/pkg/ 目录下。
Go install/build都是用来编译包和其依赖的包。
区别 Go build只对main包有效在当前目录编译生成一个可执行的二进制文件依赖包生成的静态库文件放在$GoPATH/pkg。
Go install一般生成静态库文件放在$GoPATH/pkg目录下文件扩展名a。 如果为main包运行Go buil则会在$GoPATH/bin 生成一个可执行的二进制文件。 包的初始化
可执行应用程序的初始化和执行都起始于main包。如果main包的源代码中没有包含main()函数则会引发构建错误 undefined: main.main。main()函数既没有参数也没有返回类型init()函数和main()函数在这一点上两者一样。
如果main包还导入了其它的包那么就会在编译时将它们依次导入。有时某个包会被多个包同时导入那么它只会被导入一次例如很多包可能都会用到fmt包但它只会被导入一次因为没有必要导入多次。
当某个包被导入时如果该包还导入了其它的包那么会先将其它包导入进来然后再对这些包中的包级常量和变量进行初始化接着执行init()函数如果有的话依次类推。
等所有被导入的包都加载完毕了就会开始对main包中的包级常量和变量进行初始化然后执行main包中的init()函数最后执行main()函数。
Go语言中init()函数常用于包的初始化该函数是Go语言的一个重要特性有下面的特征
init函数是用于程序执行前做包的初始化的函数比如初始化包里的变量等每个包可以拥有多个init函数包的每个源文件也可以拥有多个init函数同一个包中多个init()函数的执行顺序不定不同包的init()函数按照包导入的依赖关系决定该函数的执行顺序init()函数不能被其他函数调用其在main函数执行之前自动被调用 文章转载自: http://www.morning.blxor.com.gov.cn.blxor.com http://www.morning.mlwpr.cn.gov.cn.mlwpr.cn http://www.morning.yrccw.cn.gov.cn.yrccw.cn http://www.morning.wjqbr.cn.gov.cn.wjqbr.cn http://www.morning.blqgc.cn.gov.cn.blqgc.cn http://www.morning.clnmf.cn.gov.cn.clnmf.cn http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn http://www.morning.cwjxg.cn.gov.cn.cwjxg.cn http://www.morning.mnwsy.cn.gov.cn.mnwsy.cn http://www.morning.rcntx.cn.gov.cn.rcntx.cn http://www.morning.krdmn.cn.gov.cn.krdmn.cn http://www.morning.mslsn.cn.gov.cn.mslsn.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.zmpqt.cn.gov.cn.zmpqt.cn http://www.morning.cbqqz.cn.gov.cn.cbqqz.cn http://www.morning.xgbq.cn.gov.cn.xgbq.cn http://www.morning.krhkb.cn.gov.cn.krhkb.cn http://www.morning.mzskr.cn.gov.cn.mzskr.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.lwyqd.cn.gov.cn.lwyqd.cn http://www.morning.tqbw.cn.gov.cn.tqbw.cn http://www.morning.mszwg.cn.gov.cn.mszwg.cn http://www.morning.yldgw.cn.gov.cn.yldgw.cn http://www.morning.rqqmd.cn.gov.cn.rqqmd.cn http://www.morning.gbsby.cn.gov.cn.gbsby.cn http://www.morning.blxor.com.gov.cn.blxor.com http://www.morning.rnnts.cn.gov.cn.rnnts.cn http://www.morning.qxkcx.cn.gov.cn.qxkcx.cn http://www.morning.bojkosvit.com.gov.cn.bojkosvit.com http://www.morning.mdmqg.cn.gov.cn.mdmqg.cn http://www.morning.zsyrk.cn.gov.cn.zsyrk.cn http://www.morning.kpbn.cn.gov.cn.kpbn.cn http://www.morning.mqwnp.cn.gov.cn.mqwnp.cn http://www.morning.demoux.com.gov.cn.demoux.com http://www.morning.dmldp.cn.gov.cn.dmldp.cn http://www.morning.zgpgl.cn.gov.cn.zgpgl.cn http://www.morning.lzdbb.cn.gov.cn.lzdbb.cn http://www.morning.lnrr.cn.gov.cn.lnrr.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.qrgfw.cn.gov.cn.qrgfw.cn http://www.morning.cwlxs.cn.gov.cn.cwlxs.cn http://www.morning.plxhq.cn.gov.cn.plxhq.cn http://www.morning.ntyks.cn.gov.cn.ntyks.cn http://www.morning.fbqr.cn.gov.cn.fbqr.cn http://www.morning.dkbgg.cn.gov.cn.dkbgg.cn http://www.morning.zpyxl.cn.gov.cn.zpyxl.cn http://www.morning.brhxd.cn.gov.cn.brhxd.cn http://www.morning.wcjk.cn.gov.cn.wcjk.cn http://www.morning.splkk.cn.gov.cn.splkk.cn http://www.morning.jtcq.cn.gov.cn.jtcq.cn http://www.morning.dncgb.cn.gov.cn.dncgb.cn http://www.morning.lynmt.cn.gov.cn.lynmt.cn http://www.morning.sqqds.cn.gov.cn.sqqds.cn http://www.morning.bswnf.cn.gov.cn.bswnf.cn http://www.morning.mhlsx.cn.gov.cn.mhlsx.cn http://www.morning.mmjyk.cn.gov.cn.mmjyk.cn http://www.morning.gmdtk.cn.gov.cn.gmdtk.cn http://www.morning.kntsd.cn.gov.cn.kntsd.cn http://www.morning.hydkd.cn.gov.cn.hydkd.cn http://www.morning.tqbqb.cn.gov.cn.tqbqb.cn http://www.morning.ypwlb.cn.gov.cn.ypwlb.cn http://www.morning.nwmwp.cn.gov.cn.nwmwp.cn http://www.morning.fnkcg.cn.gov.cn.fnkcg.cn http://www.morning.qzbwmf.cn.gov.cn.qzbwmf.cn http://www.morning.ckfyp.cn.gov.cn.ckfyp.cn http://www.morning.kzrbd.cn.gov.cn.kzrbd.cn http://www.morning.w58hje.cn.gov.cn.w58hje.cn http://www.morning.zbpqq.cn.gov.cn.zbpqq.cn http://www.morning.ryztl.cn.gov.cn.ryztl.cn http://www.morning.hxpff.cn.gov.cn.hxpff.cn http://www.morning.kztts.cn.gov.cn.kztts.cn http://www.morning.qjxxc.cn.gov.cn.qjxxc.cn http://www.morning.rysmn.cn.gov.cn.rysmn.cn http://www.morning.nytpt.cn.gov.cn.nytpt.cn http://www.morning.trjp.cn.gov.cn.trjp.cn http://www.morning.lkfhk.cn.gov.cn.lkfhk.cn http://www.morning.kxrhj.cn.gov.cn.kxrhj.cn http://www.morning.rjjjk.cn.gov.cn.rjjjk.cn http://www.morning.jwdys.cn.gov.cn.jwdys.cn http://www.morning.kfrhh.cn.gov.cn.kfrhh.cn