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

北戴河网站建设莱芜都市网旗下论坛

北戴河网站建设,莱芜都市网旗下论坛,怎么把安装的字体导入wordpress,深圳+服装+网站建设库源码文件是不能被直接运行的源码文件#xff0c;它仅用于存放程序实体#xff0c;这些程序实体可以被其他代码使用#xff08;只要遵从Go语言规范的话#xff09;。 这里的“其他代码”可以与被使用的程序实体在同一个源码文件内#xff0c;也可以在其他源码文件#x…库源码文件是不能被直接运行的源码文件它仅用于存放程序实体这些程序实体可以被其他代码使用只要遵从Go语言规范的话。 这里的“其他代码”可以与被使用的程序实体在同一个源码文件内也可以在其他源码文件甚至其他代码包中。 那么程序实体是什么呢在 Go 语言中程序实体是变量、常量、函数、结 构体和接口的统称。 我们总是会先声明或者说定义程序实体然后再去使用。比如在上一篇 的例子中我们先定义了变量name然后在main函数中调用fmt.Printf函 数的时候用到了它。 再多说一点程序实体的名字被统称为标识符。标识符可以是任何 Unicode 编码可以表示的字母字符、数字以及下划线“_”但是其首字母不能是数字。 从规则上说我们可以用中文作为变量的名字。但是我觉得这种命名方式非常不好自己也会在开发团队中明令禁止这种做法。作为一名合格的程序员我们应该向着编写国际水准的程序无限逼近。 怎样把命令源码文件中的代码拆分到其他库源码文件 如果在某个目录下有一个命令源码文件 demo4.go如下 package main import ( flag ) var name string func init() {flag.StringVar(name, name, everyone, The greeting object.) } func main() {flag.Parse()hello(name) } 其中的代码你应该比较眼熟了。我在讲命令源码文件的时候贴过很相似的代码那个源码文件名为 demo2.go。 这两个文件的不同之处在于demo2.go 直接通过调用fmt.Printf函数打印问候语而当前的 demo4.go 在同样位置调用了一个叫作hello的函数。 函数hello被声明在了另外一个源码文件中我把它命名为 demo4_lib.go并且放在与demo4.go 相同的目录下。如下 // 需在此处添加代码。[1] import fmt func hello(name string) {fmt.Printf(Hello, %s!\n, name) }那么问题来了注释 1 处应该填入什么代码 典型回答 答案很简单填入代码包声明语句package main。为什么我之前说过在同一个目录下的源码文件都需要被声明为属于同一个代码包。 如果该目录下有一个命令源码文件那么为了让同在一个目录下的文件都通过编译其他源码文件应该也声明属于main包。 如此一来我们就可以运行它们了。比如我们可以在这些文件所在的目录下运行如下命令并得到相应的结果。 $ go run demo4.go demo4_lib.go Hello, everyone!或者像下面这样先构建当前的代码包再运行。 $ go build puzzlers/article3/q1 $ ./q1 Hello, everyone!在这里我把 demo4.go 和 demo4_lib.go 都放在了一个相对路径为puzzlers/article3/q1的目录中。 在默认情况下相应的代码包的导入路径会与此一致。我们可以通过代码包的导入路径引用其中声明的程序实体。但是这里的情况是不同的。 注意demo4.go 和 demo4_lib.go 都声明自己属于main包。我在前面讲 Go 语言源码的组织方式的时候提到过这种用法即源码文件声明的包名可以与其所在目录的名称不同只要这些文件声明的包名一致就可以。 也就是说正确的用法是你需要把该项目的打包文件下载到本地的任意目录下然后经解压缩后把“Golang_Puzzlers”目录加入到环境变量GOPATH中。还记得吗这会使“Golang_Puzzlers”目录成为工作区之一。 这个问题考察的是代码包声明的基本规则。这里再总结一下。 第一条规则同目录下的源码文件的代码包声明语句要一致。也就是说它们要同属于一个代码包。这对于所有源码文件都是适用的。 如果目录中有命令源码文件那么其他种类的源码文件也应该声明属于main包。这也是我们能够成功构建和运行它们的前提。 第二条规则源码文件声明的代码包的名称可以与其所在的目录的名称不同。在针对代码包进行构建时生成的结果文件的主名称与其父目录的名称一致。 对于命令源码文件而言构建生成的可执行文件的主名称会与其父目录的名称相同这在我前面的回答中也验证过了。 1.怎样把命令源码文件中的代码拆分到其他代码包 我们先不用关注拆分代码的技巧。我在这里仍然依从前面的拆分方法。我把 demo4.go 另存为 demo5.go并放到一个相对路径为puzzlers/article3/q2的目录中。 然后我再创建一个相对路径为puzzlers/article3/q2/lib的目录再把demo4_lib.go 复制一份并改名为 demo5_lib.go 放到该目录中。 现在为了让它们通过编译我们应该怎样修改代码你可以先思考一下。我在这里给出一部分答案我们一起来看看已经过修改的 demo5_lib.go 文件。 package lib5 import fmt func Hello(name string) {fmt.Printf(Hello, %s!\n, name) }可以看到我在这里修改了两个地方。第一个改动是我把代码包声明语句由package main改为了package lib5。注意我故意让声明的包名与其所在的目录的名称不同。第二个改动是我把全小写的函数名hello改为首字母大写的Hello。 2.代码包的导入路径总会与其所在目录的相对路径一致吗 库源码文件 demo5_lib.go 所在目录的相对路径是puzzlers/article3/q2/lib而它却声明自己属于lib5包。在这种情况下该包的导入路径是puzzlers/article3/q2/lib还是puzzlers/article3/q2/lib5 这个问题往往会让 Go 语言的初学者们困惑就算是用 Go 开发过程序的人也不一定清楚。 我们一起来看看。 首先我们在构建或者安装这个代码包的时候提供给go命令的路径应该是目录的相对路径就像这样 go install puzzlers/article3/q2/lib该命令会成功完成。之后当前工作区的 pkg 子目录下会产生相应的归档文件具体的相对路径是: pkg/darwin_amd64/puzzlers/article3/q2/lib.a其中的darwin_amd64就是我在讲工作区时提到的平台相关目录。可以看到这里与源码文件所在目录的相对路径是对应的。 为了进一步说明问题我需要先对 demo5.go 做两个改动。第一个改动是在以import为前导的代码包导入语句中加入puzzlers/article3/q2/lib也就是试图导入这个代码包。 第二个改动是把对hello函数的调用改为对lib.Hello函数的调用。其中的lib.叫做限定符旨在指明右边的程序实体所在的代码包。不过这里与代码包导入路径的完整写法不同只包含了路径中的最后一级lib这与代码包声明语句中的规则一致。 现在我们可以通过运行go run demo5.go命令试一试。错误提示会类似于下面这种。 ./demo5.go:5:2: imported and not used: puzzlers/article3/q2/lib as lib5 ./demo5.go:16:2: undefined: lib第一个错误提示的意思是我们导入了puzzlers/article3/q2/lib包但没有实际使用其中的任何程序实体。这在 Go 语言中是不被允许的在编译时就会导致失败。 注意这里还有另外一个线索那就是“as lib5”。这说明虽然导入了代码包puzzlers/article3/q2/lib但是使用其中的程序实体的时候应该以lib5.为限定符。这也就是第二个错误提示的原因了。Go 命令找不到lib.这个限定符对应的代码包。 为什么会是这样根本原因就是我们在源码文件中声明所属的代码包与其所在目录的名称不同。请记住源码文件所在的目录相对于 src 目录的相对路径就是它的代码包导入路径而实际使用其程序实体时给定的限定符要与它声明所属的代码包名称对应。 有两个方式可以使上述构建成功完成。我在这里选择把 demo5_lib.go 文件中的代码包声明语句改为package lib。理由是为了不让该代码包的使用者产生困惑我们总是应该让声明的包名与其父目录的名称一致。 3.什么样的程序实体才可以被当前包外的代码引用 你可能会有疑问我为什么要把 demo5_lib.go 文件中的那个函数名称hello的首字母大写实际上这涉及了 Go 语言中对于程序实体访问权限的规则。 超级简单名称的首字母为大写的程序实体才可以被当前包外的代码引用否则它就只能被当前包内的其他代码引用。 通过名称Go 语言自然地把程序实体的访问权限划分为了包级私有的和公开的。对于包级私有的程序实体即使你导入了它所在的代码包也无法引用到它。 4.对于程序实体还有其他的访问权限规则吗 答案是肯定的。在 Go 1.5 及后续版本中我们可以通过创建internal代码包让一些程序实体仅仅能被当前模块中的其他代码引用。这被称为 Go 程序实体的第三种访问权限模块级私有。 具体规则是internal代码包中声明的公开程序实体仅能被该代码包的直接父包及其子包中的代码引用。当然引用前需要先导入这个internal包。对于其他代码包导入该internal包都是非法的无法通过编译。 “Golang_Puzzlers”项目的puzzlers/article3/q4包中有一个简单的示例可供你查看。你可以改动其中的代码并体会internal包的作用。 文章来自郝林老师的《Go语言36讲》
http://www.hkea.cn/news/14509215/

相关文章:

  • 济南网站优化收费建设网站要那些
  • 网站规划与网站建设手机网站做指向
  • 新注册公司网站怎么做太原网页设计培训学校
  • 网站项目设计流程案例博客网站开发源代码
  • 单位建设网站申请信用卡wordpress不支持中文标签
  • 哪些网站是dz做的2023年防疫新政策
  • 郑州网站建设兼职邯郸信息网平台
  • 湖州市住房和城乡建设局网站下载软件的网址
  • 做谷歌网站吗抖音代运营招标
  • 黄村网站建设一条龙济南莱芜又出新情况了
  • 天津网站怎么做seo办公用品网站建设市场定位
  • 网站简易后台最好免费观看高清播放
  • 网站新闻对百度优化有用吗画册设计赏析
  • html交易网站设计实例江西省赣州市南康家具城
  • 西安北郊做网站深圳网络营销推广服务
  • 厦门市建设局官方网站证书查询网站 攻击
  • 企业门户网站需求分析wordpress卡核销
  • 网站被攻击的方法企业宣传手册封面模板
  • 福州网站模板建站运河网站制作
  • 正规的佛山网站建设价格天眼查公司注册信息
  • 网站建设的500字小结平台优化
  • 麻涌企业网站建设pc网站转wap网站
  • 深圳网站设计比较好的公司有哪些手机网站制作器
  • 新手入门网站建设做网站会什么软件
  • 企业网站设计服务公司温州网站建设 温州网站制作
  • 网站建设投标书模板网站开发的安全策略
  • 做自媒体小视屏哪个网站好毕设做网站怎么命题
  • 网站定制开发建设网络网站设计培训
  • 网站建设的平台软件开发公司服务
  • 查 网站接入服务提供者名称网站建设方案书 下载