Golang 基础赋能(一)

Golang 介绍

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

go 语言特色

  • 静态编译,强类型语言
  • 内存安全,GC(垃圾自动回收)
  • 语法简单,速度直逼 C 语言
  • 天生高并发
  • 跨平台(Linux、Windows、Mac os)

go 语言安装

1. 官网地址:https://go.dev/doc/install Golang 基础赋能(一) - 图1 ### 结构 plain package main /* 当前文件所在的包名 */ import "fmt" /* 包导入 */ func main() { /* 这是我的第一个简单的程序 */ fmt.Println("Hello, World!") } 在每一个 go 程序项目中必须存在一个 main 包、一个 main 函数,标志这是整个项目的启动函数 go 项目的启动命令:go run 文件名 注意事项:
  • 每行程序结束后不需要撰写分号(;)。
  • 大括号({)不能单独放在一行。
  • if 判断式和 for 循环不需要以小括号包覆起来。

数据类型

go 语言的数据类型大体可以分成四种 1. 布尔型:布尔型的值只可以是常量 true 或者 false 2. 数字类型
类型 描述
uint8 无符号 8 位整型 (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)
float32 32 位浮点型数
float64 64 位浮点型数
complex64 32 位实数和虚数
complex128 64 位实数和虚数
byte
rune 类似 int32
uint 32 或 64 位
int 与 uint 一样大小
uintptr 无符号整型,用于存放一个指针
ps: rune 官方对他的解释是这样的:rune 其实就是 int32 的别名,主要是用于区分字符值和整数值的。返回采用 UTF-8 编码的 Unicode 码点。Go 语言通过 <font style="color:rgb(233, 30, 99) !important;background-color:rgb(246, 246, 246);">rune</font> 处理中文,支持国际化多语言 下面是示例
  1. package main
  2. import (
  3. "fmt"
  4. "unicode/utf8"
  5. )
  6. func main() {
  7. s := "hello 中国"
  8. fmt.Println(len(s))
  9. fmt.Println(utf8.RuneCountInString(s))
  10. fmt.Println(len([]rune(s)))
  11. }
3. 字符串类型 4. 派生类型
  • (a) 指针类型(Pointer)
  • (b) 数组类型
  • (c) 结构化类型 (struct)
  • (d) Channel 类型
  • (e) 函数类型
  • (f) 切片类型
  • (g) 接口类型(interface)
  • (h) Map 类型

变量声明

  1. /* 声明一个变量 */
  2. var identifier type
  3. 1. 不进行赋值的方式
  4. ex
  5. var a int
  6. 2.根据赋值自行判断类型
  7. var a = 1
  8. 3.简写(最常用)
  9. a := 1
  10. /* 多变量声明 */
  11. var identifier1, identifier2 type
  12. 1.多变量同类型声明
  13. ex:
  14. var a,b int
  15. 2.多变量类型自动推断
  16. ex:
  17. var a, b = 1, ""
  18. 3.简写
  19. ex:
  20. a, b := 1, ""
  21. 4.多行 // 这种因式分解关键字的写法一般用于声明全局变量
  22. ex:
  23. var (
  24. a int
  25. b string
  26. )

常量声明

  1. /* 声明一个常量,类型一般可以省略 */
  2. const identifier [type] = value
  3. ex:
  4. const a = 1
  5. /* 特殊的常量 */
  6. iota
  7. iotago当中预设的一个特殊常量。它只能被使用在const关键字出现的时候,并且在初次设定的时候值是0,一般常用于设置常量的枚举值当中
  8. ex:
  9. package main
  10. import "fmt"
  11. const (
  12. Cancelled = iota //订单已取消 0
  13. NoPay //未支付 1
  14. PendIng // 未发货 2
  15. Delivered // 已发货 3
  16. Received // 已收货 4
  17. )
  18. func main() {
  19. fmt.Println(Cancelled, NoPay) // 打印:0,1
  20. }

运算符

算术运算符

运算符 描述
+
-
*
/
% 求余
++ 自增
自减

关系运算符

运算符 描述
== 检查两个值是否相等,如果相等返回 True 否则返回 False
!= 检查两个值是否不相等,如果不相等返回 True 否则返回 False
> 检查左边值是否大于右边值,如果是返回 True 否则返回 False
< 检查左边值是否小于右边值,如果是返回 True 否则返回 Fals
>= 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False
<= 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False

逻辑运算符

运算符 描述
&& 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。
逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。
! 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。

位运算符

运算符 描述
& 按位与运算符 “&” 是双目运算符。 其功能是参与运算的两数各对应的二进位相与。
其功能是参与运算的两数各对应的二进位相或
^ 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为 1。
<< 其功能把 “<<” 左边的运算数的各二进位全部左移若干位,由 “<<” 右边的数指定移动的位数,高位丢弃,低位补 0。
>> 其功能是把 “>>” 左边的运算数的各二进位全部右移若干位,”>>” 右边的数指定移动的位数。
ps: 假设有 A 和 B 两个二进制数,进行下列运算 相与:A 和 B 两个二进制位子上的都是 1 结果才是 1 相或:A 和 B 两个二进制位子上有一个是 1 结果才是 1 相异:A 和 B 两个二进制位子上相反结果才是 1

赋值运算符

运算符 描述
= 简单的赋值运算符,将一个表达式的值赋给一个左值
+= 相加后再赋值
-= 相减后再赋值
*= 相乘后再赋值
/= 相除后再赋值
%= 求余后再赋值
<<= 左移后赋值
>>= 右移后赋值
&= 按位与后赋值
^= 按位异或后赋值
= 按位或后赋值

条件语句

if 语句

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

Golang 基础赋能(一) - 图2

switch 语句

  1. switch var1 {
  2. case val1:
  3. ...
  4. case val2:
  5. ...
  6. default:
  7. ...
  8. }

Golang 基础赋能(一) - 图3

select 语句

  1. select {
  2. case <- channel1:
  3. // 执行的代码
  4. case value := <- channel2:
  5. // 执行的代码
  6. case channel3 <- value:
  7. // 执行的代码
  8. // 你可以定义任意数量的 case
  9. default:
  10. // 所有通道都没有准备好,执行的代码
  11. }
  12. 注意事项:
  13. 每个 case 都必须是一个channel
  14. 所有 channel 表达式都会被求值
  15. 所有被发送的表达式都会被求值
  16. 如果任意某个通道可以进行,它就执行,其他被忽略。
  17. 如果有多个 case 都可以运行,select 会随机公平地选出一个执行,其他不会执行。
  18. 如果有 default 子句,则执行该语句。
  19. 如果没有 default 子句,select 将阻塞,直到某个通道可以运行;Go 不会重新对 channel 或值进行求值。
  1. go中分为局部变量以及全局变量两种:
  2. - 局部变量:在函数体内声明的变量,只在函数体内⽣效
  3. - 全局变量:在函数体外声明的变量,可以在整个包甚⾄外部包中⽣效
  4. ex
  5. package main
  6. import "fmt"
  7. /* 声明全局变量 */
  8. var g int
  9. func main() {
  10. /* 声明局部变量 */
  11. var a, b int
  12. /* 初始化参数 */
  13. a = 10
  14. b = 20
  15. g = a + b
  16. fmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)
  17. }
  18. 值得注意的是,在go中如果想要能够在外部包中使⽤定义的变量、函数,需要进⾏⾸字⺟的⼤写
  19. ex
  20. var A int /*可以在外部包中被引⽤*/
  21. var b int /*不可以在外部包中被引⽤*/