Go语言bool类型(布尔类型)

Go语言中的布尔类型与 PHP 中的布尔类型差不多,关键字都是 bool,但是Go语言中布尔类型的值只能是预定义常量 true 或 false。

在Go语言中布尔类型的声明方式如下所示:

var v1 bool
v1 = true
v2 := (1 == 2)      // v2 也会被推导为 bool 类型与 PHP 不同的是,Go语言是强类型语言,变量类型一旦确定,就不能将其他类型的值赋值给该变量。因此,布尔类型不能接受其他类型的赋值,也不支持自动或强制的类型转换。以下的示例是一些错误的用法,会导致编译错误:

var b bool
b = 1           // 编译错误
b = bool(1) // 编译错误在Go语言中,以下的用法才是正确的:

var b bool
b = (1!=0)                      // 编译正确
fmt.Println(“Result:”, b) // 打印结果为 Result: true此外,由于强类型的缘故,Go语言在进行布尔值真假判断时,对值的类型有严格限制,不同类型的值不能直接使用==!=运算符进行比较,否则就会报错,比如下面这段代码:

b := (false == 0);在编译的时候就会报如下错误:

cannot convert 0 (type untyped number) to type bool
invalid operation: false == 0 (mismatched types bool and int)同样,!运算符也不能作用于非布尔类型值。

Go语言浮点类型(小数)

浮点型表示存储的数据是实数,如 3.145。关于浮点型的说明,如下所示:

类型字节数说明
float32432 位的浮点数
float6464 位的浮点数

浮点数的声明方式如下所示:

var x float32   // 声明 32 位浮点数
var y float64   // 声明 64 位浮点数常量 math.MaxFloat32 表示 float32 能获取的最大值,大约是 3.4×1038;常量 math.SmallestNonzeroFloat32 表示 float32 能获取的最小值,大约为 1.4×10-45

常量 math.MaxFloat64 表示 float64 能获取的最大值,大约是 1.8×10308;常量 math.SmallestNonzeroFloat64 表示 float64 能获取的最小值,大约为 4.9×10-324

Go语言匿名变量

Go语言的函数可以返回多个值,而事实上并不是所有的返回值都用得上,那么就可以使用匿名变量。匿名变量的特点是一个下画线__本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。

使用匿名变量时,只需要在变量声明的地方使用下画线替换即可,下面通过一个简单的示例来演示一下。

【示例】定义一个函数,功能为返回两个 int 类型变量,第一个返回 10,第二个返回 20,第一次调用舍弃第二个返回值,第二次调用舍弃第一个返回值,具体语法格式如下所示。

package main
import (
    "fmt"
)
func GetData() (int, int) {
    return 100, 200
}
func main() {
    a, _ := GetData() // 舍弃第二个返回值
    _, b := GetData() // 舍弃第一个返回值
    fmt.Println(a, b)
}

运行结果如下:

100 200匿名变量不占用内存空间,不会分配内存,而且匿名变量与匿名变量之间也不会因为多次声明而无法使用。

本文章引用自 http://www.weixueyuan.net/(因感觉收获甚多,特地收藏,如有侵权,联系作者,必删)

Go语言变量多重赋值

变量多重赋值是指多个变量同时赋值。在Go语言语法中,变量初始化和变量赋值是两个不同的概念,Go语言的变量赋值与其他语言一样,但是Go语言提供了其他程序员期待已久的多重赋值功能,可以实现变量交换。多重赋值让Go语言比其他语言减少了代码量。

以简单的算法交换变量为例,传统写法如下所示。

var a int = 10
var b int = 20
var tmp int
tmp = a
a = b
b = t新定义的变量是需要内存的,于是有人设计了新的算法来取代中间变量,其中一种写法如下所示。

var a int = 10
var b int = 20
a = a ^ b
b = b ^ a
a = a ^ b以Go语言的多重赋值功能为例,写法如下所示。

var a int = 10
var b int = 20
b, a = a, b从以上例子来看,Go语言的写法明显简洁了许多,需要注意的是,多重赋值时,左值和右值按照从左到右的顺序赋值。这种方法在错误处理和函数当中会大量使用。

本文章引用自 http://www.weixueyuan.net/(因感觉收获甚多,特地收藏,如有侵权,联系作者,必删)

Go语言变量声明与初始化

变量声明有多种形式,未初始化的标准格式如下所示。

var 变量名 变量类型定义一个变量名为 a 的 int 类型变量,示例代码如下:

var a int批量声明未初始化的变量,不需要每行都通过 var 关键字声明,具体语法格式如下所示。

var (
    a int
    b string
    c []float32
    d func() bool
    e struct{
        x int
        y string
    }
)未初始化变量的默认值有如下特点:

  • 整型和浮点型变量默认值为 0;
  • 字符串默认值为空字符串;
  • 布尔型默认值为 false;
  • 函数、指针变量、切片默认值为 nil。

初始化变量的标准格式如下所示:

var 变量名 变量类型 = 表达式初始化变量也可以省略变量类型,让编译器自动推断变量类型,如下所示:

var 变量名 = 表达式初始化变量的简短声明格式(短变量声明格式)如下所示:

变量名 := 表达式分别使用以上三种方式定义一个变量,并初始化为 10,示例代码如下:

var a int = 10      // 初始化变量的标准格式
var b = 10          // 初始化变量的编译器自动推断类型格式
var c := 10         // 初始化变量的简短声明格式使用:=赋值操作符可以高效地创建一个新的变量,称为初始化声明。声明语句省略了 var 关键字,变量类型将由编译器自动推断。这是声明变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。该变量名必须是没有定义过的变量,若定义过,将发生编译错误。

var a = 10
a := 20         // 重复定义变量 a编译报错如下:

no new variables on left side of :=多个短变量声明和赋值中,至少有一个新声明的变量出现在左侧,那么即便其他变量名可能是重复声明的,编译器也不会报错。情况如下所示。

var a = 10
a, b := 100, 200虽然这种方法不会报错,但是在使用过程中应尽量避免。

本文章引用自 http://www.weixueyuan.net/(因感觉收获甚多,特地收藏,如有侵权,联系作者,必删)

变量

变量是计算机语言中储存数据的基本单元,它的功能是存储数据。变量可通过变量名(也叫标识符)访问,例如:小千的年龄是 18 岁,可以使用一个变量来引用 18,如下图所示。

变量
图:变量
变量的本质是计算机分配的一小块内存,专门用于存放指定的数据,在程序运行过程中该数值可以发生改变;变量的存储往往具有瞬时性,或者说是临时存储,当程序运行结束,存放该数据的内存就会释放,该变量就会随着内存的释放而消失。就像日常生活中存放水的水杯,当水杯损坏的时候,装在里面的水也会流失掉。

变量又分为局部变量和全局变量。

  • 局部变量,是定义在大括号{}内部的变量,大括号的内部也是局部变量的作用域;
  • 全局变量,是定义在函数和大括号{}外部的变量。

Go 语言的变量名由字母、数字和下画线组成,但是首个字符不能为数字。Go语言的语法规定,定义的局部变量若没有被调用会发生编译错误,编译报错的内容如下所示:

age declared and not used表达式是值和操作符的组合,它们可以通过求值成为单个值。“数据类型”是一类值,每个值都只属于一种数据类型。

本文章引用自 http://www.weixueyuan.net/(因感觉收获甚多,特地收藏,如有侵权,联系作者,必删)

Go语言编码规范

1、注释

注释就是对代码功能进行的解释,方便开发人员理解被注释的代码,Go语言中有以下两种形式。

  • 单行注释:是最常见的注释形式,可以在任何位置使用以//开头的单行注释;
  • 多行注释:也叫块注释,均以/*开头,并以*/结尾,且不可以嵌套使用。多行注释一般用于文档描述或注释成块的代码片段。

2、分隔符

程序中可能会使用到的分隔符包括括号( )、中括号[ ]和大括号{ };程序中可能会使用到的标点符号,如下表所示。

   符号名称      符号   
 .
逗号 ,
分号 ;
冒号 :
省略号 …

3、Go语言的空格

Go语言中变量的声明必须使用空格隔开,例如var age int

在Go语言代码中适当使用空格能够让程序更容易阅读,在变量与运算符之间加入空格,可以使程序看起来更加美观,例如:

a = x + y

4、语句的结尾

在Go语言程序中,换行代表着一个语句结束,并不需要像 Java 那样以分号结尾,因为这些工作都将由Go编译器自动完成。

如果打算将多个语句写在同一行,那么则必须使用分号;将它们人为区分,但在实际开发中并不建议将多行代码写在同一行。

5、可见性规则

Go语言中,通常使用大小写来决定标识符(常量、变量、类型、接口、结构或函数)是否可以被外部包所调用。

如果标识符以一个大写字母开头,那么其对象就可以被外部包的代码所使用(使用时程序需要先导入这个包),类似面向对象语言中的 public;如果标识符以小写字母开头,那么它对于外部包则是不可见的,但是它们在整个包的内部是可见并且可用的,类似面向对象语言中的 private。

本文章引用自 http://www.weixueyuan.net/(因感觉收获甚多,特地收藏,如有侵权,联系作者,必删)

Go语言的关键字与标识符

1、预定义标识符

预定义标识符是Go语言系统预先定义的标识符,具有见名知义的特点,例如函数“输出”(printf)、“新建”(new)、“复制”(copy)等。预定义标识符可以作为用户标识符使用,只是这样会失去系统规定的原意,使用不当还会使程序出错。下面列举了 36 个预定义标识符,如下表所示。

appendboolbyteсарclosecomplexcomplex64complex128uint16 
copyfalsefloat32float64imagintint8int16uint32
int32int64iotalenmakenewnilpanicuint16
printprintlnrealrecoverstringtrueuint uint8uintptr

2、关键字

Go语言的关键字是系统自带的,是具有特殊含义的标识符。Go语言中内置了 25 个关键字用于开发。下面列举了Go语言代码中会使用到的 25 个关键字或保留字,如下表所示。

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
forimport returnvarcontinue

3、自定义标识符

用户根据需要自定义的标识符,一般用来给变量、类型、函数等程序实体起名字。

自定义标识符实际上是一个或多个字母A~Z 和 a~z、数字0~9、下画线_等组成的序列,但是第一个字符必须是字母或下画线,而不能是数字。

Go语言不允许在自定义标识符中使用“@”、“$”或“%”等符号,也不允许将关键字用作自定义标识符。如果将预定义标识符用作自定义标识符,那么自定义标识符的含义会覆盖预定义标识符,容易造成程序混乱。另外,Go语言是一种区分大小写的编程语言。因此,Manpower 和 manpower 是两个不同的标识符。

错误的自定义标识符示例如下表所示:

错误的自定义标识符错误原因
1xy以数字开头
caseGo语言的关键字
chanGo语言的关键字
nil预定义标识符

需要注意的是,在现实生活中,名字可以重复,比如可能有很多人叫作张三,但是在Go语言中,标识符绝对不能重复,要确保每个标识符都代表一个独立的个体。

本文章引用自 http://www.weixueyuan.net/(因感觉收获甚多,特地收藏,如有侵权,联系作者,必删)

GO的基本程序

让我们来开始第一个程序

package main
import "fmt"
func main() {
    /*输出"Hello World!"*/
    fmt.Println("Hello World!")
}

第 1 行 package main 定义了包名。必须在源文件中非注释的第 1 行指明这个文件属于哪个包,例如 package main。package main 表示一个可独立执行的程序,每个Go语言应用程序都需要包含一个名为 main 的包,并且该包中包含一个名为 main() 的函数(该函数是Go语言可执行程序的执行起点,既不能带参数,也不能定义返回值)。

第 2 行 import “fmt” 中 import 语句用于导入该程序所依赖的包。由于本示例程序中用到了 Println() 函数,而该函数属于 fmt 包,所以需要导入 fmt 包,fmt 包实现了格式化 I/O(输入/输出)。

第 3 行 func main() 是程序入口。所有Go语言函数都是以关键字 func 开头的,每一个可执行程序都必须包含一个 main() 函数,这个 main() 函数通常是程序启动后第一个执行的函数,如果有 init() 函数则会先执行 init() 函数。

第 4 行 /*…*/ 是程序的注释,在程序执行时,注释的部分将被程序忽略,不会执行。

第 5 行 fmt.Println(…) 用来将字符串输出到控制台,并在最后自动增加一个换行字符\n。使用 fmt.Print(“Hello, World!\n”) 也会得到相同的结果。

除此之外,还有以下几点值得注意:

  • 只有 package 名称为 main 的包可以包含 main() 函数;
  • 一个可执行程序有且仅有一个 main 包;
  • 通过 import 关键字来导入其他非 main 包;
  • 可以通过 import 关键字导入单个包,也可以同时导入多个包。

kali基本工具,NETCAT ( 第一部分)

NC /NCCAT 、 网络中的瑞士军刀,有以下几点:

1. 侦听模式/传输模式

2. Telnet / 获取banner信息

nc-nv 1.1.1.1 110

nc-nv 1.1.1.1 25

nc-nv 1.1.1.1 80

3. 传输文本信息

NC -L -P 4444

NC -NV 1.1.1.1 4444

4. 传输文件目录

A: NC -LP 333 > 1.MP4

B: NC -NV 1.1.1.1 333 < 1.MP4 -q 1

5. 加密传输文件

6. 远程控制木马

7. 加密所有流量

8. 留媒服务器

远程克隆硬盘