@[toc]

分享一下学习go的网站:
国外的网站:https://golang.org
go编程网站:https://golang.google.cn/ (go的包,函数等均可以在这里查看)
菜鸟教程-Go :菜鸟
易百教程-Go:易百教程
W3c-Go:w3c
极客-Go:极客
Go高级编程
GO语言中文库:https://studygolang.com/pkgdoc(常用)

1.GO语言的注释
  1. //单行注释
  2. /*
  3. 多行注释
  4. */

2.GO语言的转义字符
  1. \t :对齐功能
  2. \n:换行符
  3. \“:一个”字符
  4. \r:回车

代码:

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("hello\tdadaw")
  5. fmt.Println("hello\ndadaw")
  6. fmt.Println("hello\rdadaw")
  7. fmt.Println("hello\"dadaw")
  8. }

效果:
Go基础知识二 - 图1


3.GO语言的基本类型

3.1数字类型

数据类型工作中就是把数据分成内存大小不同的数据,充分利用

  • uint8 位整型 (0 到 255)
  • uint16 16位整型 (0 到 65535)
  • uint32 32位整型 (0 到 4294967295)
  • uint64 64位整型 (0 到 18446744073709551615)
  • int8 8位整型 (-128 到 127)
  • int16 16位整型 (-32768 到 32767)
  • int32 32位整型 (-2147483648 到 2147483647)
  • int64 64 位整型 (-9223372036854775808 到 9223372036854775807)
  • uintptr 无符号整型,用于存放一个指针

3.2浮点型

float32 32位浮点型数
float64 64位浮点型数
complex64 32位实数和虚数
complex128 64位实数和虚数

3.3布尔型

(a)true (b)false

3.3字符串型

预先声明是string

3.4派生类型

(a)指针类型
(b)数组类型
(c)结构类型
(d)联合类型
(e)函数类型
(f)切片类型
(g)函数类型
(h)接口类型
(i) 类型


4.GO语言变量

go是静态类型语言,因此声明的变量必须是明确类型的,一般用var关键字
变量=变量名+变量值+类型
变量规范:变量由字母,数字,下划线组成,不能以数字开头

-标准声明变量的格式:

  1. var 变量名 变量类型
  2. var 变量名,变量名 *变量类型

代码:

  1. var num int
  2. var num,num2 *int

-批量声明格式:

  1. var (
  2. a int
  3. b string
  4. c []float32
  5. d func() bool
  6. e struct {
  7. x int
  8. }
  9. )
  • 简短格式:(声明了数据类型的变量是不能使用简短格式输出的)
  • 不能提供数据类型
  • 只能在函数内部使用
  • 定义的变量,显示初始化
  1. 名字:= 表达式

代码:

  1. func main() {
  2. a:=100
  3. c,d:=50,"huawei"
  4. }

常用声明赋值总结

  1. package main
  2. import "fmt"
  3. //全局声明的变量类型
  4. var (
  5. name string //字符串
  6. age int //整数型
  7. salary float32 //浮点型
  8. )
  9. func main() {
  10. //以下均是局部变量
  11. // 简短式表达式
  12. a, b, c := 100, 100.12345, "你好"
  13. fmt.Println(a)
  14. fmt.Println(b)
  15. fmt.Println(c)
  16. //声明多个变量类型表达式()
  17. var d, e, f = 18.5, "小王", 4500
  18. fmt.Println(d, e, f)
  19. //这里使用全局变量声明的类型,拿来使用输出
  20. name = "huawei"
  21. age = 18
  22. salary = 1000
  23. fmt.Println(name)
  24. fmt.Println(age)
  25. fmt.Println(salary)
  26. }
  27. 输出:
  28. 100
  29. 100.12345
  30. 你好
  31. 18.5 小王 4500
  32. huawei
  33. 18
  34. 1000

5.GO语言常量

常量(const)一般被定义后,在程序运行时,是不会被修改的量,iota除外

  • 常量定义的格式:(变量类型可以省略,在定义值时,编译器可以自动推断类型)

const defintion [type] = values

  • 多个相同类型的常量定义:

const defintion_1,defintion_2 = value01,value02

变量的案例:

  1. package main
  2. import "fmt"
  3. //定义的变量一般在全局范围
  4. const language string = "GO"
  5. const scholar = "caicai"
  6. func main() {
  7. //局部变量内使用变量
  8. fmt.Println("this is const")
  9. fmt.Println("语言:", language, "学者:", scholar)
  10. }
  11. 运行输出:
  12. this is const
  13. 语言: GO 学者: caicai

特殊常量iota
iota 简单记:i/o它, 是一个可以改变的常量,每遇到一个const关键字时会被重置为0,在const内的数字会被自动增加1,直接比喻为常量计数器

iota的案例:

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("this is iota")
  5. const (
  6. a = iota //a=iota开始计数,a=0
  7. b //1
  8. c //2
  9. d //3
  10. e //4
  11. )
  12. fmt.Println(a, b, c, d, e)
  13. const (
  14. aa = iota //aa=iota开始计数,aa=0
  15. bb = "linux" //bb赋予单独值,iota此时计数为1(不显示计数数字,只显示赋予的值)
  16. cc = "java" //cc赋予独值,iota此时计数为2(不显示计数数字,只显示赋予的值)
  17. dd = "python" //dd赋予独值,iota此时计数为3(不显示计数数字,只显示赋予的值)
  18. ee = iota //ee没有单独赋予值,恢复计数为4(显示计数数字)
  19. )
  20. fmt.Println(aa, bb, cc, dd, ee)
  21. const (
  22. aaa = iota
  23. bbb = "三国演义"
  24. ccc = 500
  25. ddd = 600 //ddd赋予单独值,iota此时计数为3(不显示计数数字,只显示赋予的值)
  26. eee //eee继承ddd的赋予值,iota此时计数为4(不显示计数数字,只显示赋予的值)
  27. fff //fff继承eee的赋予值,iota此时计数为5(不显示计数数字,只显示赋予的值)
  28. ggg = iota //恢复计数,ggg=6
  29. )
  30. fmt.Println(aaa, bbb, ccc, ddd, eee, fff, ggg)
  31. }
  32. 运行输出:
  33. this is iota
  34. 0 1 2 3 4
  35. 0 linux java python 4
  36. 0 三国演义 500 600 600 600 6

kubernetes中对于iota的使用

  1. 针对于pod组件的SuccessErrorUnscheduleableUnschedulableAndUnresolvableWaitSkip这六种状态字段
  2. 表达的效果为Success=0Error=1
  1. package main
  2. import "fmt"
  3. func main() {
  4. type Code int //定义一个Code的整数型
  5. const (
  6. // Success means that plugin ran correctly and found pod schedulable.
  7. // NOTE: A nil status is also considered as "Success".
  8. Success Code=iota //开始计数,Success=0
  9. // Error is used for internal plugin errors, unexpected input, etc.
  10. Error //iota自增加1Error=1
  11. // Unschedulable is used when a plugin finds a pod unschedulable. The scheduler might attempt to
  12. // preempt other pods to get this pod scheduled. Use UnschedulableAndUnresolvable to make the
  13. // scheduler skip preemption.
  14. // The accompanying status message should explain why the pod is unschedulable.
  15. Unschedulable //iota自增加1Unschedulable=2
  16. // UnschedulableAndUnresolvable is used when a PreFilter plugin finds a pod unschedulable and
  17. // preemption would not change anything. Plugins should return Unschedulable if it is possible
  18. // that the pod can get scheduled with preemption.
  19. // The accompanying status message should explain why the pod is unschedulable.
  20. UnschedulableAndUnresolvable //iota自增加1UnschedulableAndUnresolvable=3
  21. // Wait is used when a Permit plugin finds a pod scheduling should wait.
  22. Wait //iota自增加1Wait=4
  23. // Skip is used when a Bind plugin chooses to skip binding.
  24. Skip //iota自增加1Wait=5
  25. )
  26. fmt.Println(Success, Error, Unschedulable, UnschedulableAndUnresolvable, Wait, Skip)
  27. }
  28. 输出显示:
  29. [Running] go run "/root/workspace/goproject/src/go_code/project01/main/kubernet-iota.go"
  30. 0 1 2 3 4 5

6.GO语言运算符

6.1GO运算的分类

算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其他运算符

6.2算术运算
  1. 运算符 描述 表达式
  2. + 相加 A + B
  3. - 相减 A - B
  4. * 相乘 A * B
  5. / 相除 A/ B
  6. % 求余 A % B
  7. ++ 自增 A++
  8. -- 自减 A--

实例

  1. package main
  2. import "fmt"
  3. func main() {
  4. a := 20
  5. b := 10
  6. var c int
  7. c = a + b
  8. fmt.Println(c)
  9. c = a * b
  10. fmt.Println(c)
  11. c = a / b
  12. fmt.Println(c)
  13. c = a % b
  14. fmt.Println(c)
  15. a++
  16. fmt.Println(a)
  17. b++
  18. fmt.Println(b)
  19. }
  20. 运行输出:
  21. [Running] go run "/root/workspace/goproject/src/go_code/project01/main/arich.go"
  22. 30
  23. 200
  24. 2
  25. 0
  26. 21
  27. 11

6.3关系运算
  1. == 检查两个值是否相等,如果相等返回 True 否则返回 False (A == B) False
  2. != 检查两个值是否不相等,如果不相等返回 True 否则返回 False (A != B) True
  3. > 检查左边值是否大于右边值,如果是返回 True 否则返回 False (A > B) False
  4. < 检查左边值是否小于右边值,如果是返回 True 否则返回 False (A < B) True
  5. >= 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False (A >= B) False
  6. <= 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False (A <= B) True

6.4逻辑运算
  1. && 逻辑 AND 运算符 如果两边的操作数都是 True,则条件 True,否则为 False
  2. || 逻辑 OR 运算符 如果两边的操作数有一个 True,则条件 True,否则为 False
  3. ! 逻辑 NOT 运算符 如果条件为 True,则逻辑 NOT 条件 False,否则为 True

6.5赋值运算
  1. = 表达式赋值,给予左边
  2. += 相加再赋值
  3. -= 相减再赋值
  4. *= 相乘后再赋值
  5. /= 相除后再赋值
  6. %= 求余后再赋值
  7. <<= 左移后赋值
  8. >>= 右移后赋值
  9. &= 按位与后赋值
  10. ^= 按位异或后赋值
  11. |= 按位或后赋值

6.6位运算
  1. a b a&b a|b a^b
  2. 0 0 0 0 0
  3. 0 1 0 1 1
  4. 1 1 1 1 0
  5. 1 0 0 1 1

6.7其它运算
  1. & 返回变量存储地址
  2. * 指针变量

7go条件语句

if 语句
if else语句
if else else if嵌套语句
switch语句

7.1if语句

  1. if 布尔表达式 {
  2. /* 当布尔表达式为 true 时执行 */
  3. }

7.2if else语句

  1. d := 400
  2. e := 500
  3. if d >= e {
  4. fmt.Println("d>=e")
  5. } else {
  6. fmt.Println("d<e")
  7. }
  8. 运行输出:
  9. d<e

7.3if嵌套语句

  1. if 布尔表达式noe {
  2. /* 在布尔表达式 one true 时执行 */
  3. if 布尔表达式 two {
  4. /* 在布尔表达式two true 时执行 */
  5. }
  6. }

7.4switch语句

switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。
switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。
switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough

  1. package main
  2. import "fmt"
  3. func main() {
  4. var grade string = "A"
  5. var marks int = 90
  6. switch marks {
  7. case 90:
  8. grade = "A"
  9. case 80:
  10. grade = "B"
  11. case 70:
  12. grade = "C"
  13. case 60:
  14. grade = "D"
  15. default:
  16. grade = "E"
  17. }
  18. switch {
  19. case grade == "A":
  20. fmt.Println("优秀\n")
  21. case grade == "B":
  22. fmt.Println("良\n")
  23. case grade == "C", grade == "D":
  24. fmt.Println("一般\n")
  25. case grade == "E":
  26. fmt.Println("很差\n")
  27. }
  28. }
  29. 运行输出:
  30. 优秀

8.go循环语句

8.1for循环语句格式:

  1. for 变量初始条件; 循环条件; 变量迭代{}
  2. for 循环条件{}
  3. for {}

输出5遍:2月的天,3月的地

  1. package main
  2. import "fmt"
  3. func main() {
  4. for init := 1; init <= 5; init++ {
  5. fmt.Println("2月的天,3月的地")
  6. }
  7. }
  8. 运行输出:
  9. [Running] go run "/root/workspace/goproject/src/go_code/project01/main/for.go"
  10. 2月的天,3月的地
  11. 2月的天,3月的地
  12. 2月的天,3月的地
  13. 2月的天,3月的地
  14. 2月的天,3月的地

输出30-60数字

  1. package main
  2. import "fmt"
  3. func main() {
  4. for i := 30; i <= 60; i++ {
  5. fmt.Println(i)
  6. }
  7. }
  8. 运行输出:
  9. [Running] go run "/root/workspace/goproject/src/go_code/project01/main/for.go"
  10. 30
  11. 31
  12. 32
  13. 33
  14. 34
  15. 35
  16. 36
  17. 37
  18. 38
  19. 39
  20. 40
  21. 41
  22. 42
  23. 43
  24. 44
  25. 45
  26. 46
  27. 47
  28. 48
  29. 49
  30. 50
  31. 51
  32. 52
  33. 53
  34. 54
  35. 55
  36. 56
  37. 57
  38. 58
  39. 59
  40. 60

8.2循环控制语句

  1. break:中断for循环,跳出switch语句
  2. continue:跳出当前循环,继续下一轮循环
  3. goto:可以无条件地转移到过程中指定的行

break有条件的中止循环体的输出
输出30-60数字,但是不要50-60

  1. package main
  2. import "fmt"
  3. func main() {
  4. for i := 30; i <= 60; i++ {
  5. fmt.Println(i)
  6. if i > 50 {
  7. break //循环到i=50时,直接跳出循环
  8. }
  9. }
  10. }
  11. 运行循环:
  12. [Running] go run "/root/workspace/goproject/src/go_code/project01/main/for.go"
  13. 30
  14. 31
  15. 32
  16. 33
  17. 34
  18. 35
  19. 36
  20. 37
  21. 38
  22. 39
  23. 40
  24. 41
  25. 42
  26. 43
  27. 44
  28. 45
  29. 46
  30. 47
  31. 48
  32. 49
  33. 50

打印九九乘法表

%d:输出宽度也是输出十进制整数 printf:格式输出函数

  1. package main
  2. import "fmt"
  3. func main() {
  4. //处理九行
  5. for y := 1; y <= 9; y++ {
  6. // 针对于y的行处理列
  7. for x := 1; x <= y; x++ {
  8. fmt.Printf("%d*%d=%d ", x, y, x*y)
  9. }
  10. // 手动生成回车
  11. fmt.Println()
  12. }
  13. }
  14. 运行输出:
  15. 1*1=1
  16. 1*2=2 2*2=4
  17. 1*3=3 2*3=6 3*3=9
  18. 1*4=4 2*4=8 3*4=12 4*4=16
  19. 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
  20. 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
  21. 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
  22. 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
  23. 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81