Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86373814

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

HireHackking

Go语言学习笔记

参考(ctrl c+v)https://www.kancloud.cn/kancloud/the-way-to-to-go//

作为研究指出,仅记录关键点。

初始

平台和体系结构

GO语言开发团队为以下操作系统开发了一个编译器:

Linux

freebsd

Mac OS X(也称为Darwin)

目前有2个编译器:GO Native编译器GC和非本地编译器GCCGO。两个编译器都在类似Unix的系统下工作。其中,编译器的GC版本已移植到Windows平台并集成到主分布中。您也可以通过安装MINGW在Windows平台上使用GCC编译器。两个编译器都以单通道形式工作。

您可以在以下平台上获得GO 1.4源代码和二进制文件:

Linux 2.6+:AMD64,386和ARM架构

Mac OS X(Snow Leopard + Lion):AMD64和386架构

Windows 2000+:AMD64和386架构

GO环境变量

$ goroot表示GO在计算机上的安装位置。它的价值通常为$ home/go。当然,您也可以在其他地方安装它。

$ gacararch代表目标机器的处理器架构,其值可以为386,AMD64或ARM。

$ Goos代表目标机器的操作系统,其值可以是Darwin,FreeBSD,Linux或Windows。

$ Gobin代表编译器和链接器的安装位置。默认值为$ goroot/bin。如果您使用的是1.0.3及以后,则通常可以将其值设置为空。 GO将使用上述默认值。

安装目录列表

/bin:包含可执行文件,例如:编译器,GO工具

/doc:包含示例程序,代码工具,本地文档等。

/lib:包括文档模板

/MISC:包含与支持GO编辑器和CGO示例有关的配置文件

/os_arch:对象文件(.a)包含标准库的软件包

/src:包含源代码构建脚本和标准库的软件包的完整源代码(GO是开源语言)

/src/cmd:包含GO和C的编译器和命令行脚本

GO DEBUGGER

使用打印语句在适当的位置输出相关变量(PRINT/PRINTLN和FMT.PRINT/FMT.PRINTLN/FMT.PRINTF)的值。

使用fmt.printf中的以下规范打印有关变量的相关信息:%+v打印包括字段在内的实例的完整信息

%#V打印有关一个实例的完整信息,包括字段和合格的类型名称

%t打印一种类型的完整描述

使用恐慌语句(第13.2节)获取堆栈跟踪信息(所有称为功能的列表,直到恐慌)。

使用关键字延期跟踪代码执行过程(第6.4节)。

构建和运行GO程序

在大多数IDE中,在构建每个程序并保存格式的源文件之前,自动调用源格式工具GOFMT。如果构建成功,将不会输出信息。当发生编译时错误时,它将指示源代码中发生了哪种错误线,例如:声明且未使用。通常,您可以双击IDE中的错误消息,然后直接跳到发生错误的线路。

如果程序顺利执行并成功退出,则将在控制台上输出的代码0的程序将输出。

从GO 1开始,请使用go构建应用程序的更方便的工具:

去构建编译并安装自己的软件包和依赖项

去安装自己的软件包和依赖项软件包

语言的核心结构和技术

基本结构和基本数据类型

你好world

123456789package mainimport ( 'fmt')func main() { fmt.Println('hello, world')}

包的概念

Package is a way of structured code: each program consists of the concept of a package (usually referred to as pkg), and can use its own package or从其他软件包导入内容。

软件包主是指可以独立执行的程序,并且每个GO应用程序包含一个称为MAIN的软件包。

所有包装名称均应使用小写字母。

注释

//单行注释/* xxxx */多行评论

功能

您可以在括号()中编写0个或更多函数的参数(使用逗号,分离),每个参数的名称必须随后是该参数的类型。

1func sum(a,b int)int {返回a + b}

类型

基本类型:int,float,bool,string

结构化(复合):结构,阵列,切片,地图,通道

结构化类型没有实际值,它将零作为默认值使用

键入转换

类型B=B=B=B=类型的值(A型值的值)

1valueofTypeb=typeb(valueoftypea)

常量

123456牛肉,两个,c=“肉”,2,“ veg” const,星期一,星期二,星期二,星期三,星期六,星期六,星期六=1、2、2、3、4、5、5、6const(星期一,星期三,星期三,星期三,星期三,星期三,星期三,星期三,星期三,星期四,星期四,星期四,星期四,星期四,星期四,33,星期四变量,将变量的类型放在变量的名称之后

123456789111121314151617VAR标识符类型多行自动根据变量VAR的值自动推断其类型(a=15 b=false=false='go hello hello to the the the World!'numships=50 city string)并行\ cam c=5,c=5,7,abc'abc''命名法,即第一个单词是小写,每个新单词的第一个字母是大写,例如:numships and Startdate

变量(常数,类型或功能)在程序中具有一定的动作范围,称为范围。

如果在功能主体之外声明变量,则它被视为一个全局变量,可以在整个软件包,外部软件包(导出后)中使用,无论您声明哪个源文件或您在哪个源文件中调用该变量。

在功能体中声明的变量称为局部变量,其范围仅在函数体内,而参数和返回值变量也是局部变量。

变量

函数FMT.print和fmt.println使用格式标识符%V自动格式化字符串,这两者都会在每个参数之间自动添加空格,而后者也在字符串末端添加了一个newline。例如:

123fmt.print('Hello:',23)将输出:Hello: 23

打印

该变量可以在全局声明中初始化,也可以在INIT函数中进行初始化。

它不能人为地调用,但是在初始化每个软件包后会自动执行,并且执行优先级高于主函数。

源文件只能包含一个初始化功能。初始化始终以一个线程执行,并按照软件包的依赖项顺序执行。

init.go

123456789包装传输'Math'var Pi float64func init(){pi=4 * MATH.ATAN(1)//init(1)//init(init()函数pi} pi} user_init.go imports intimpt trans(在同一路径中)并使用变量pi

123456789101112 package mainimport('fmt'./trans')var twopi=2*trans.pifunc main(){fmt.printf('2*pi=%g \ n',twopi,twopi)布尔类型只能是恒定的还是错误的

数字类型:整数int和浮点浮点

格式指定符:在格式字符串中,%d用于格式化整数(%x和%x用于格式化在十六进制中表示的数字),%g用于格式化浮点(%f输出浮点数,%e输出数量floing e uptucts e Outputs Scientific Countific Counting代表),并使用%0D来指定输出固定长度长度Integer,在此中必不可少。

数值转换:当转换A32BitInt=INT32(A32Float)时,将丢弃小数点后的数字。

复数:GO具有以下复数类型:

12COMPLEX64(32位真实和虚构)复杂128(64位真实和虚构)位操作:一元操作员:逐个位置补充^,左侧移动,右移,位右移动

二进制运算符:位和位,位或|,位Xor ^,位清除^

逻辑运算符:==,=,=,=

算术运算符:可用于整数和浮点数的常见二进制运算符为+, - , *和/。

运营商和优先级:

一些操作员的优先级更高,二进制运算符的操作指示是从左到右的。下表列出了所有操作员及其优先级,从上到下,下到底到下,表示优先级从高到低:

12345678优先操作员7 ^! 6 * /% ^ 5 + - | ^ 4==!====3-2 1 ||当然,您可以通过使用括号暂时增加特定表达式的总体操作优先级。

类型别名:1Type tz int字符类型:char.go

1234567891111213VAR CH Int='\ u0041'var ch2 int='\ u03b2'var ch3 int='\ u00101234'fmt.printf('%d -%d -%d -%d -%d -%d -%d -%d -%d -%d -%d \ n',ch,ch2,ch2,ch3,ch3,ch3,ch3,ch3,ch3) CH2,CH3)//farmicfmt.printf('%x-%x -%x \ n',ch,ch2,ch3)//utf-8 bytesfmt.printf('%u -%u -%u -%u',ch,ch2,ch2,ch3,ch3)//utf -8代码点输出:65-946-10533336A--946-105332336A -R41-R4 101234U+0041 -U+03B2 -U+101234

init函数

字符串类型的零值是一个零长的字符串,即,一个空字符串''。

一般比较运算符(==,=,=,=,)实现了通过内存中字节对字符串的比较。您可以使用函数len()来获取字符串占据的字节长度,例如:len(str)。

字符串剪接字符+:两个字符串S1和S2可以通过S :=S1 +S2,S +='World'一起剪接。

解释字符串:

此类字符串包含在双引号中,相关的逃生字符将被替换,包括:

\ n:断路

\ r:马车返回

\ t:选项卡键

\ u或\ u:unicode字符

\\:后斜线本身

非解释字符串:

这类字符串封闭在背部和支持线路断裂中,例如:

1`这是一个原始的字符串\ n`将按原样输出。

基本类型和操作员

12345678911112121415161718192022222222222224252627PACKAGE MAINIMPOAGE('fmt'time'time'time'time'time'time.durationfunc main()星期三12月21日09:52:14 +0100 rst 2011 fmt.printf('%02d。%02d。%4d \ n',t.month(),t.month(),t.year(),t.year(),//21.12.212.2011 t=time.now time.now() 08:52:14 +0000 UTC 2011 FMT.PRINTLN(time.now()) T.ADD(周) //星期三12月21日08:56:34 2011 FMT.PRINTLN(T.FORMAT('02 JAN 2006 15:04'))//)//21 DEC 2011 2011 083:52 S 3:=T. format(format 08:52:14 +0000 UTC 2011=20111221}

字符串

该程序将其值存储在内存中。每个内存块(或单词)都有一个地址,该地址通常由十六进制数字表示,例如:0x6B0820或0xF84001D7F0。

指针变量可以指向任何值的内存地址。它指向该值的内存地址,在32位计算机上占据4个字节,在64位机器上占据了8个字节,并且与指向的值的大小无关。

GO语言的地址字符是,它将在将其放置在变量上之前返回相应变量的内存地址。

指针类型之前是*编号(前缀),以获取指针指向的内容。 *数字是类型更换器。使用指针参考值称为间接参考。

当定义指针并且未分配给任何变量时,其值为零。

指针变量通常缩写为PTR。

示例:显示将新值分配给*p并更改变量自己的值(这是字符串)

12345678911112131415 package mainimport'fmt'func main(){s :='good byed bye'v var p *string=s *p='ciao'fmt.printf('这是指针p:%p:%p:%p3360%p33,在这里p33 prints prints prints prints p3 3 %s \ n', *p)//打印字符串fmt.printf('这是字符串s:%s \ n',s)//same string} outter}输出:这是指针p:0x2540820在此处,在此处是字符串*p: ciaohere是字符串S3333333:11010101010101010101010101010101010101010101010101010101010101010101033333333333333333333333333333333333333333333:10010 1234567891111213141516171920212222324IF条件1 {//如果条件2 {//做某事数字,例如3'+'or%s to doiT.'func init(){如果runtime.goos=='windows'{stript=fmt.sprintf(stript,'ctrl+z,enter')} else {//unix-like提示=fmt=fmt.sprintf(提示条件1:案例条件2: default:}

时间和日期

指针

123456789Package Mainimport'fmt'func Main(){for I :=0;我5; i ++ {fmt.printf('这是%d迭代\ n',i)}}}

控制结构

,它可以迭代任何集合(包括数组和地图),其一般形式为:for IX,Val :=range coll {}。

val始终是集合中相应索引值的副本,因此它通常只有仅阅读属性,并且对其进行的任何修改都不会影响集合中的原始值(Translator的注释:如果Val是指指针,则将生成指针的副本,并且集合中的原始值仍可以修改)

123for pos,char :=范围str {.}

if-else结构

破坏动作范围是出现此陈述后的最内向结构,可以以任何形式用于循环(反,有条件判断等)。但是在开关或选择语句中,断点语句的效果是跳过整个代码块并执行后续代码。

继续忽略剩余循环主体并直接进入下一个循环的过程,但是下一个循环并未无条件执行。在执行之前,仍需要满足循环的判断条件。

开关结构

,用于,开关或选择语句可以与标签形式的标识符一起使用,即以一条线上的结肠(:)结尾的第一个单词(GOFMT将自动将后续代码移动到下一行)。

123456789 label1: for I :=0; i=5; i ++ {for J :=0; j=5; J ++ {如果J==4 {继续Label1} fmt.printf('I IS:%D,和J IS:%D \ n',I,i,j)}}}}}}}}}}}}}

对于结构

-1010 3333660010 :010

基于反迭代

10101010101010101011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111马云惹不起马云191199来实间mainimport'fmt'func main(){fmt.printf('乘2 * 5 * 5 * 6=%d \ n',乘数3nums(2,5,6))//var i1 int=var i1 int=multiply3nums(2,5,5,5,6) int,c int)int {//var product int=a * b * c //返回产品返回产品a * b * c}输出显示:倍数2 * 5 * 6=60 3

范围结构

getx2andx3带有getx2andx3_2的两个函数演示如何使用非命名返回值和命名返回值。当需要返回多个非命名返回值时,需要使用(int,int)封闭它们。

12345678910111213141516171819202122232425262728package mainimport 'fmt'var num int=10var numx2, numx3 intfunc main() { numx2, numx3=getX2AndX3(num) PrintValues() //Output: num=10, 2x num=20, 3x num=30 numx2,numx3=getx2andx3_2(num)printValues()//输出:num=10,2x num=20,3x num=30} func printValues(){fmt.printf('num=%=%d,2x num=%d,2x num=%d,3x num=%d d \ n',num=%d \ n',numx got func func func func func func func inct func func func funct func func inct func functx Intup(func) int){return 2 * input,3 * input} func getx2andx3_2(input int)(x2 int,x3 int){x2=2 * input x3=3 * input //return x2,return x2,x3 return} :01

休息并继续

whitespace字符用于匹配某些不需要的值并匹配某些不良的值并使其canduct缩。 TrixValues是一个具有三个不需要任何参数的返回值的函数。在下面的示例中,我们将第一个和第三个返回值分配给I1和F1。第二个返回值分配给空白符号_,然后自动丢弃。

123456789111121314PACKAGE MAINIMPORT'fmt'func Main