KainHao的博客

Web/Python/CTF咸鱼

[持续更新] KainHao的GoLang摸鱼笔记

开发 2 评 103 度

# 0x01 环境安装与Hello World

别再问我IDE去哪里了, 我个人喜欢使用VIM和GoLand, VSCode也可以hhh

Linux 下安装

这里以Ubuntu为例:

在终端里执行如下语句:

apt install golang-go

Windows 下安装

https://golang.google.cn/dl/下选择go1.16.3.windows-amd64.msi, 然后根据引导.

你可以将C:Gobin添加到Path变量中, 方便在命令行环境中调试, 但是我仍然推荐在Linux中进行学习和开发

Hello World!

然后创建新目录, 命名为go-dev , 在其下新建hello_world.go, 写入以下内容:

package main

import "fmt"

func main(){
    /* Hello World */
    // Hello World
    /*
        Hello World
                    */
    print("Hello World\n")
    fmt.Println("Hello World!")
}

然后执行go run hello_world.go , 你应该看到以下结果:

Hello World!
Hello World!

我们来解析一下上面的代码:

首先, package main是声明包名, 一个合格的Go程序应该在源代码中非注释的第一行声明包名, 另外, 每个Go程序都应包括一个main包.

然后, import "fmt"引入了fmt包, 这个包实现了格式化输入输出.

然后func main()定义了main函数. 和C一样, main函数是每一个程序所必须包含的. 它应该是init函数(如果有的话)后第一个执行的.

{}不可以单行出现, 它必须出现在函数声明的右括号的后方.

然后是注释行. 对于单行注释, 你可以使用/* *///, 注释块则使用/* */, 切记不可嵌套使用.

接着我们来到了两行输出.

GoLang官方给出的关于print函数的说明是这样的:

... and writes the result to standard error.

也就是说print在Go中输出到标准错误流中并打印,官方不建议在标准开发时使用, 在debug时用一用还是可以的hhh(Python开发者觉得很赞), 而fmt.print(或fmt.Println(输出后换行))属于标准输出流. 在接下来的笔记中, 我们将统一使用fmt.Println

所以一个合格的Go程序必须包含如下部件:

  • 包声明
  • 引入
  • (非常重要)注释!!
  • 函数
  • 语句

0x02 数据类型

每个竞赛生最讨厌的一节课

Golang的数据类型与其他语言基本无异, 主要包括以下类型

  • Boolean型. 又称布尔型,包括且仅包括true和false.
  • Int型. 整型, 基于架构的类型来讲包括uint8,uint16,uint32,uint64(无符号)和int8,int16,int32,int64(有符号)
  • Float型. 浮点型, 支持32/64位浮浮点(float32, float64)和32/64实数和虚数(complex32, complex64)
  • String型. 字符串.
  • 其他类型,包括指针,数组,Channel,函数...

0x03 变量与常量

变量

声明

Go语言的变量名可以由字母、下划线与数字组成, 需要注意的是不能以数字开始.

声明变量一般使用var关键字, 如下所示:

package main

import "fmt"

func main(){
    var this_is_a_string string = "String"
    var this_is_int_1, this_is_int_2 int = 114, 514 
    /* hhh */
    
    fmt.Prinln(a, b, c)
}

在声明变量时若是没有指定值(未初始化), 则其默认值将为零值.(对于Boolean型, 零值为False; 对于String型, 零值为空(""))

你也可以让编译器根据你指定的值自行判断类型:

package main

import "fmt"

func main(){
    var a = 1
    var b = true
    fmt.Println(a, b)
}

或者再简洁一点,直接省略掉var, 使用:=声明新变量:

package main

import "fmt"

func main(){
    a := 1
    b := "String" //与 var b string = "String" 相同
    fmt.Println(a, b)
}

赋值

与大部分语言相同, Go的赋值也使用=标识符:

package main

import "fmt"

func main(){
    a := 1
    b := a
    fmt.Println(a, b)
}

常量

声明

我们使用const关键字来声明函数:

package main

import "fmt"

func main(){
    /*
    事实上, 把常量标识符全部用大写字母来表示绝对是一个好想法
    */
    const A string = "String"
    const B = "String"
    const C = 1
    fmt.Println(A, B, C)
}

const也可以用作枚举:

package main

import "fmt"

func main(){
    const(
        A = "String"
        B = 1
    )
}

Iota

iota是一个特别神秘特殊的常量, 通常被形容为"可以被编译器修改".

iota 在const关键字出现时将被重置为 0(const内部的第一行之前),const中每新增一行常量声明将使 iota 计数一次(iota 可理解为const语句块中的行索引).

iota 只是在同一个 const 常量组内递增, 每当有新的 const 关键字时, iota 计数会重新开始.

0x04 运算

算术运算符

算术运算符还是老几样:

  • +: 相加
  • -: 相减
  • *: 相乘
  • /: 相除
  • %: 取模
  • ++: 自加
  • --: 自减

逻辑与关系运算符

关系运算符

Python开发者狂喜

  • ==: 相等时返回true
  • !=: 不等时返回true
  • >: 大于时返回true
  • <: 小于时返回true
  • >=: 大于等于时返回true
  • <=: 小于等于时返回返回true

逻辑运算符

  • &&: 与运算符. 两边都为true时返回true
  • ||: 或运算符. 两边中任意一个为true时返回true
  • |: 非运算符. 两边中都为False时返回true

赋值运算符

  • == : 赋值
  • +=: 相加后赋值
  • -=: 相减后赋值
  • *=: 相乘后赋值
  • /=: 相除后赋值
  • %=: 取模后赋值

需要注意的是Go中自增(++)与自减(--)不能在赋值语句中使用, 只能以单独表达式的形式出现.

0x05 循环、判断与函数

循环

Go中使用for作为循环语句, 格式如下:

package main

import "fmt"
/*
这种格式的for语句形如for init(赋值表达式); condition(关系或逻辑表达式); post(赋值表达式{}, 与C中的for类似
*/
func main(){
    a := 0
    for i := 0; i <= 100; i++{
        a++
        fmt.Println(a)
    }
    fmt.Println(a)
}
package main

import "fmt"
/* 
此种for语句形如for condition(关系或逻辑表达式){}
*/
func main(){
    for true{
        fmt.Println("按Cntl-C退出无限循环")
    }
}

(未完待续)

Python实现ELGamal加密
2 评论
    SimpleAstronautChrome 83Android
    4月26日回复

    原来大佬是golang工程师?

      KainHaoFirefox Browser 89Windows 10
      4月26日回复

      @SimpleAstronaut 不是hhh
      最近比赛要用Go就去看了一眼∠( ᐛ 」∠)_