go主要特征—标识符、关键字、构建、编译
区别关键字和标识符:
标识(zhi)符,所谓标识符,就是指变量、函数、属性的名字,或者是函数的参数。
关键字,就是在控制语句的开始或结束以及执行特定操作时具有关键作用、特定作用的符号。
保留(关键)字不能用作常量、变量、函数名以及结构字段等标识符。从字面意思上即可得知它是被保留的,将来可能被用作关键字
划重点了:·关键字是系统自带的 ,标识符是自定义的。
文件名Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go 。如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.go 。文件名不包含空格或其他特殊字符。
一个源文件可以包含任意多行的代码,Go 本身没有对源文件的大小进行限制。
Go语言命名Go的函数、变量、常量、自定义类型、包(package)的命名方式遵循以下规则:
1)首字符可以是任意的Unicode字符或者下划线
2)剩余字符可以是Unicode字符、下划线、数字
3)字符长度不限
标识符具有特殊意义的词,比如变量、常量、函数。
标识符是允许作为变量(函数、类等)名称的有效 ...
Go依赖管理—从godep到go mod
1.1 为什么需要依赖管理最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?
1.2 godepGo语言从v1.5开始开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等。
godep是一个通过vender模式实现的Go语言的第三方依赖管理工具,类似的还有由社区维护准官方包管理工具dep。
注意:在Go1.11之后,建议将 dep 更换为 go mod进行项目管理,更方便
安装执行以下命令安装godep工具。
1go get github.com/tools/godep
基本命令安装好godep之后,在终端输入godep查看支持的所有命令。
12345678godep save 将依赖项输出并复制到Godeps.json文件中godep go 使用保存的依赖项运行go工具godep get 下载并安装具有指定依赖项的包godep path ...
使用Go module导入本地包
go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。到今天Go1.14版本推出之后Go modules功能已经被正式推荐在生产环境下使用了。
1.1 前提假设我们现在有moduledemo和mypackage两个包,其中moduledemo包中会导入mypackage包并使用它的New方法。mypackage/mypackage.go内容如下:
1234567package mypackageimport "fmt"func New(){ fmt.Println("mypackage.New")}
我们现在分两种情况讨论:
1.2 在同一个项目下注意:在一个项目(project)下我们是可以定义多个包(package)的。
1.2.1 目录结构现在的情况是,我们在moduledemo/main.go中调用了mypackage这个包。
12345moduledemo├── go.mod├── main.go└── mypackage ...
使用oss来存取及优化图片资源
前言:
在日常开发中,不免会遇到需要实现图片上传与展示的需求。比如一个文章发布系统,我们通常会开发图片上传功能,让用户可以为自己的文章提供配图;而且图片上传后,还需要生成不同尺寸的缩略图,供文章列表等不同场景界面展示用。
做过类似功能的朋友肯定熟悉传统的做法:
首先,通过文件上传组件将图片文件通过POST请求发送到服务器端
然后,当服务器端接受到上传的图片数据后,写入本地磁盘或分布式文件系统,将图片文件保存在特定文件夹中
接着,服务端在将图片原图保存成文件的同时,调用图片处理服务(例如ImageMagic)对原图进行裁剪、压缩等处理,生成需要的缩略图文件,和原图一并保存
最后,将原图和缩略图的文件路径信息保存在数据库中,供后续展示之用
这套典型的图片上传处理流程,是作为一个合格的开发者所必须了解的必备基础知识。但是,在这一系列环节中,我们可能需要自己配置搭建高可用的文件系统,编写各种图片处理代码,还是颇费时间的。在如今讲究开发效率、快速开发产品原型、快速迭代的理念和环境下,如何利用现成服务来实现产品的功能并缩短开发周期,也是一个很有价值的事情,而且选用一个质量比较好的现成服 ...
playbook中的条件判断与错误处理
failed_when 和 changed_whenfailed_when关键字的作用是在条件成立时,将对应任务的执行状态设置为Failed
任务的执行结果控制:
在 Ansible 1.4 之前,fail模块
在 Ansible 1.4 之后,failed_when
changed_when关键字的作用是在条件成立时,将对应任务的执行状态设置为changed
failed_when在任务执行失败时,ansible-playbook会返回这个task failed,但是有些时候,我们希望playbook按照我们的意愿中断任务,以返回值中的特定字符串 做为 中断这个task的条件,当条件成立时将对应任务的状态设置为失败,中止剧本。
failed_when 示例:
123456789101112---- hosts: web1 #gather_facts: no remote_user: root tasks: - debug: msg: "I execute normally, Before the condition judgment start ...
ansible 远程Windows主机
Windows客户端配置Powershell请在标准镜像中进行预配置,以降低人员成本。
PowerShell 升级至4.0+Windows机器需要安装或升级powershell4.0以上版本,升级PowerShell步骤:
检查powershell版本$PSVersionTable
下载并安装 PowerShell 4.0(提取码:c7kl ):
Microsoft .NET Framework 4.5
powershell4.0( Windows Management Framework 4.0 )
注意 :先安装.NET Framework 4.5 ,而后安装powershell4.0
关于Windows已内置的Powershell版本说明:
Powershell是运行在Windows机器上实现系统和应用程序管理自动化的命令行脚本环境。 需要.NET环境的支持,
同时支持.NET对象。当前PowerShell有5个版本,分别为1.0、2.0、3.0、4.0、5.0
如果系统是Windows 7或者Windows Server 2008 R2,那么PowerShell ...
Ansible Playbook 标准构建
playbooks是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。
playbook最佳使用方法:
鼓励文件的重用,尽量使用include和role避免重复的代码。
尽量把大的文件分成小的文件
https://github.com/ansible/ansible-examples
12345678910111213141516171819202122232425262728293031323334production # inventory file for production serversstaging # inventory file for staging environmentgroup_vars/ ...
Role - Playbook的“Package”
Role - Playbook的“Package”Role是比include更强大灵活的代码重用和分享机制。Include类似于编程语言中的include,是重用单个文件的,功能有限。
而Role类似于编程语言中的“Package”,可以重用一组文件形成完整的功能。例如安装和配置apache,需要tasks实现安装包和拷贝模版等,httpd.conf和index.html的模版文件,和handler文件实现重起功能。这些文件都可以放在一个role里面,供不同的playbook文件重用。
Ansible非常提倡在playbook中使用role,并且提供了一个分享role的平台Ansible Galaxy, https://galaxy.ansible.com/, 在galaxy上可以找到别人写好的role。在后面的章节中,我们再详细介绍如何使用它。
定义role完整的目录结构在ansible中,通过遵循特定的目录结构,就可以实现对role的定义。。具体遵循的目录结构是什么呢?看下面的例子:
下面的目录结构定义了一个role:名字为myrole。在site.yml,调用了这个role。
...
playbook中逻辑控制语句的使用
playbook也有逻辑控制的语句:
when: 条件判断语句,类似于编程语言中的if
loop: 循环语句,类似于编程语言的中的while
block: 把几个tasks组成一块代码,便于针对一组操作的异常处理等操作。
条件语句When类似于编程语言的if
When语句有时候用户有可能需满足特定条件才执行某一个特定的步骤。例如,在某个特定版本的系统上装包,或者只在磁盘空间满了的文件系统上执行清理操作。这些操作在Playbook中用when语句实现。
主机为Debian Linux立刻关机
1234tasks: - name: "shutdown Debian flavored systems" command: /sbin/shutdown -t now when: ansible_os_family == "Debian"
根据action的执行结果,来决定接下来执行的action。
12345678910tasks: - command: /bin/false ...
playbook常见的变量的使用方法
一、Playbook中vars关键字定义的变量Playbook中定义和使用的变量的方法用户可以在Playbook中,通过vars关键字自定义变量,使用时用{{ }}引用以来即可。
下面的例子中,用户定义变量名为http_port,其值为为80。在tasks firewalld中,通过{{ }}引用
1234567- hosts: web vars: http_port: 80 remote_user: root tasks: - name: insert firewalld rule for httpd firewalld: port={{ http_port }}/tcp permanent=true state=enabled immediate=yes
把变量放在单独的文件中当变量比较多的时候,或者变量需要在多个playbook中重用的时候,可以把变量放到一个单独的文件中。通过关键字var_f ...