2018年11月

变量

声明

在Go中这样来声明变量:

var Name Type [ = value]  //不指定默认值,默认为零值
var Name = [ = value]
var (
a int = 0
b string = "test"
)

或这样简单的声明,这种方法只能用在函数(或方法)中:

Name := value  //自动判断类型
Name1,Name2 := value1,value2

变量类型与命名规则请看上一篇文章。

存储与生存期

Go语言提供自动内存管理,通常不需要特别关注变量的生存期和存放位置。Go使用了栈逃逸技术能为变量自动分配空间:可能在栈上,有可能在堆上。
关于栈逃逸技术:https://studygolang.com/articles/10026

类型转换

在Go中,不同于js之类的语言,不同类型的变量要类型转换:

TypeName(expression)  //expression:表达式或变量名

例:

var a int = 1
var b int8 = 2

a = b  //非法
a = int(b)

常量

常量中的内容不可改变:

const Name [ = value/iota]

例:

const (Name1 = iota  //Name1 = 0
       Name2  //Name2 = 1
)
//关于iota请看上一篇文章

指针

Go支持指针,也支持多级指针,指针的声明类型为T(多级:*T),在变量名前加&来获取地址:

var a = 233
b := &a
println(a)
println(b)
println(*b)
//值打印结果
233
0x11f3bfb4  //内存地址
233

又一个例子:

package main
func test(a,b int) *int {
    c := a * b  //c的作用域在函数内
    println(&c)
    return &c
}
func main() {
    p := test(2,3)
    println(p)
}
//打印结果
0x1233bfb8
0x1233bfb8
//Go编译器使用栈逃逸使这种局部变量空间分配到栈上。

由于Go的垃圾回收机制,所以Go不支持指针运算。

数组

声明

var Name [Size]type

例:

arr := [3]int{1,2,3}
arr2 := []int{1,2,3,4,5,6,7}  //自动判断长度
arr3 := [3]int{1:1,2:3}  //指定默认值,没有指定的使用类型默认值
arr4 := []int{1:2,6:4}  //指定判断长度,由最大决定

特性

  1. 数组一旦创建就固定了,不能再追加元素
  2. 数组是值类型的,数组赋值或做为函数参数都是值拷贝
  3. 数组长度是数组的组成部分,[10]int != [20]int
  4. 可根据数组创建切片

元素访问

a := [...]int{1,2,3}
for index,value := range a {
    fmt.Println(value)
}

数组长度

len(Name)

range

Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对的 key 值。

其他要说的

字符串运算

参考:

  1. https://blog.csdn.net/hatlonely/article/details/79156311
  2. https://www.cnblogs.com/yshyee/p/8810931.html

控制结构

啊?这么快就到for了?

标识符

标识符用来标示变量,类型,常量等语法对象的符号名称,在语法分析的时候作为一个token存在。(token会在文末解释)

Go 的关键字

Go只有25个关键字(当然,Go是一门极简的语言):

break  default  func  interface  select  case  defer  go  map  struch  chan  else  goto
package  switch  const  fallthrough  if  range  type  continue  for  import  return  var

数据类型与常量标识符

这些同样不可用作声明变量等:

数据类型

数值(16):
    整形(12):
        #int与uint的区别是有无符号,int(uint),int8(uint8)等的区别为bit数。
        byte  int  int8  int16  int32  int64
        uint  uint8  uint16  uint32 uint64 uintptr
    浮点(2):
        float32  float64
    复数(2):
        complex64  complex128
字符与字符串(2):
    string rune
接口型(1):
    error
布尔型(1):
    bool

常量

bool型: true false
常量计数器: iota
空: nil

空白标识符

声明匿名变量,占位标识等: _

标识符规则

标识符开头可以为“A-Z”,“a-z”以及“_”,标识符不能为纯数字(或数字开头),如以下例子:

aaaaa  //合法
aaaaa2  //合法
_aaaaa //合法
-aaaaa  //非法标识符
9aaaaa  //非法
_aaaaa2  //非法

运算符

Go语言有47个操作符,同样作为一个token存在:

算数运算符

+  -  *  /

位运算符

&  |  ^  &^  >>  <<

赋值与复核运算符

:=  =  +=  -=  *=  /=  %=  &=  |=  ^=  &^=  >>=  <<=

比较运算符

>  >=  <=  <  ==  !=

括号

(  )  {  }  [  ]

逻辑运算符

&&  ||  !

自增自减操作符

++  --

其他运算符

:  ,  ;  .  ...  <-

token

引用《Go语言核心编程》:

token是构成源程序的基本不可再分割的单元。编译器第一步就是将源程序分割为一个个独立的token,这个过程就是语法分析。Go语言的token可以分为关键字,标识符,操作符,分隔符和字面常量。

如下面个例子:

fmt.Printf("Hello World!\n")
这里有6个token
分别为:
fmt
.
Printf
(
"Hello World!\n"
)

iota

iota只能在常量表达式中使用,在枚举中应用广泛:

const (
a = iota
b
c
)
你可以试着打印这几个常量的值

9_0.png

其他要说的

运算符资料

  1. https://www.jb51.net/article/129776.htm
  2. https://studygolang.com/articles/12463

数据类型

  1. https://blog.csdn.net/qq_31179577/article/details/81486883

环境安装

在一般情况下,可以使用系统自带的包管理器来安装,不过版本肯定会老一些:

sudo apt-get install golang

也可以从 https://golang.google.cn/dl/ 下载最新的二进制包:

//截止目前最新为1.11.2,以Linux amd64为例
wget https://dl.google.com/go/go1.11.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.11.2.linux-amd64.tar.gz
//切换到用户目录,设置环境变量
cd && sudo vi .bashrc
//在末尾加入
PATH=$PATH:/usr/local/go/bin
//保存退出,更新环境变量
source .bashrc

Hello World

package main //包名
import "fmt" //标准输入输出包
func main() { //主函数
     fmt.Printf("Hello World!\n"); //这里也可以改成中文的“你好,世界”,因为环境默认utf-8
}

保存,输入go run Filename来运行。

root@ubuntu:~/go# go run t1.go
Hello World!

引用百科来简单介绍一下Go语言:

Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

我什么要学习Go语言

  1. 支持编译
  2. 相比C、C++更简单一些
  3. 效率比脚本语言高

Go语言的特性

有一句叫“只做一件事,并且把它做好”

  1. 自动垃圾回收
  2. 更丰富的内置类型
  3. 函数多返回值
  4. 错误处理
  5. 匿名函数和闭包
  6. 类型和接口
  7. 并发编程
  8. 反射
  9. 语言交互性

重新开始

重新开始,从Hello World到应用,一点一点的学。

6_0.jpg

见的多了

现在站点已经迁移过来了,从Wordpress迁移到了Typecho,Typecho有一个好,就是轻量化,访问快,比访问Wordpress的速度不知道高到哪里去了。

原站的文章就不迁移了,特别水。

新的开始:新的开始

原站:原站

TkinterPython的标准GUI库。Python使用Tkinter可以快速的创建GUI应用程序。

下面我们来通过一个简单的例子来用用它

#coding=utf-8
#Python3环境
import tkinter

def button():
    print('被点了')

if __name__ == '__main__':
    root = tkinter.Tk()
    root.title('测试窗口')
    root.geometry('300x250') #设置窗口大小(宽x高)
    root.resizable(False,False) #禁止调整窗口大小(宽x高)
    tkinter.Button(root,text='点我,点我',bg='#66ccff',command=button).pack()
    #bg:按钮背景色
    #command:按钮绑定事件
    root.mainloop() #窗口循环事件

638_0.png

Slowhttptest是依赖HTTP协议的慢速攻击DoS攻击工具,设计的基本原理是服务器在请求完全接收后才会进行处理,如果客户端的发送速度缓慢或者发送不完整,服务端为其保留连接资源池占用,大量此类请求并发将导致DoS

这次将对一台装有Lighttpd的测试服务器进行DoS攻击。

版本信息:

lighttpd/1.4.45 (ssl) - a light and fast webserver
Build-Date: Jan 14 2017 21:07:19

安装这个工具:

sudo apt-get install slowhttptest
----------------------------------------------------
git仓库地址:https://github.com/shekyan/slowhttptest

用法与参数:

~# slowhttptest -h 
 -g      在测试完成后,以时间戳为名生成一个CVS和HTML文件的统计数据
 -H      SlowLoris模式
 -B      Slow POST模式
 -R      Range Header模式
 -X      Slow Read模式
 -c      number of connections 测试时建立的连接数
 -d      HTTP proxy host:port  为所有连接指定代理
 -e      HTTP proxy host:port  为探测连接指定代理
 -i      seconds 在slowrois和Slow POST模式中,指定发送数据间的间隔。
 -l      seconds 测试维持时间
 -n      seconds 在Slow Read模式下,指定每次操作的时间间隔。
 -o      file name 使用-g参数时,可以使用此参数指定输出文件名
 -p      seconds 指定等待时间来确认DoS攻击已经成功
 -r      connections per second 每秒连接个数
 -s      bytes 声明Content-Length header的值
 -t      HTTP verb 在请求时使用什么操作,默认GET
 -u      URL  指定目标url
 -v      level 日志等级(详细度)
 -w      bytes slow read模式中指定tcp窗口范围下限
 -x      bytes 在slowloris and Slow POST tests模式中,指定发送的最大数据长度
 -y      bytes slow read模式中指定tcp窗口范围上限
 -z      bytes 在每次的read()中,从buffer中读取数据量

攻击例子:

slowhttptest -c 1000 -H -g -o test -i 10 -r 200 -t GET -u http://your_domain/ -x 24 -p 3

(这条命令会在测试后留下一个名为test的html和csv文件,下面是html的内容)

请输入图片描述

服务器防范措施:

  1. 限制链接数
  2. 设置最大并发数
  3. 限制单位时间内的请求数
  4. 对于Nginx,可以使用 ModSecurity,http_guard,ngx_lua_waf
  5. 对于Apache,可以使用 mod_security,mod_evasive

适用于Ubuntu/Debian

1.添加源

deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main
deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main

系统版本列表:

http://ppa.launchpad.net/webupd8team/java/ubuntu/dists/

2.导入GPG key到系统验证包的合法性

sudo apt-get install software-properties-common dirmngr
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886

3.更新索引与安装

sudo apt-get update && sudo apt-get install oracle-java8-installer

4.完成

java -version

5.设为默认java环境

sudo apt-get install oracle-java8-set-default