入门篇😀

环境配置

安装Go和GoLand
jetBrains旗下所有产品均可通过教育邮箱(edu.cn)免费获取专业版。

常用快捷键记忆

快捷键 说明
Ctrl + Alt + L 格式化代码

规则学习

  Go语言变量多重赋值

  • 方式一
var a int = 10
var b int = 20
b, a = a, b
  • 方式二
    这种方式是使用异或实现的

在计算机刚发明时,内存非常“精贵”。这种变量交换往往是非常奢侈的。于是计算机“大牛”发明了一些算法来避免使用中间变量

var a int = 100
var b int = 200
a = a ^ b
b = b ^ a
a = a ^ b
fmt.Println(a, b)

  反引号书写多行字符串

双引号书写字符串被称为字符串字面量(string literal),这种字面量不能跨行;
多行字符串需要使用反引号`,多用于内嵌源码和内嵌数据;
在反引号中的所有代码不会被编译器识别,而只是作为字符串的一部分。

展开查看示例代码

package main
import "fmt"
func main() {
    var temp string
    temp = `
        x := 10
        y := 20
        z := 30
        fmt.Println(x, "  ", y, "  ", z)
        x, y, z = y, z, x
        fmt.Println(x, "  ", y, "  ", z)
    `
    fmt.Println(temp)
}

  rune定义Unicode字符

使用 fmt.Printf 中的%T动词可以输出变量的实际类型

package main
import "fmt"
func main() {
    var a byte = 'a'
    fmt.Printf("%d %T\n", a, a)
    var b rune = '你'
    fmt.Printf("%d %T\n", b, b)
}

Go语言使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。

Unicode 和 ASCII 都是一种字符集,字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有唯一的一个 ID 对应,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。“你”在 Unicode 中的编码为 20320,但是在不同国家的字符集中,“你”的 ID 会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。

UTF-8 是编码规则,将 Unicode 中字符的 ID 以某种方式进行编码。UTF-8 的是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:
0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。
从 128 到 0x10ffff 表示其他字符。

根据这个规则,拉丁文语系的字符编码一般情况下,每个字符依然占用一个字节,而中文每个字符占用 3 个字节。

类型 字节数 说明
byte 1 表示 UTF-8 字符串的单个字节的值,uint8 的别名类型
rune 4 表示单个 unicode 字符,int32 的别名类型

  fmt格式化输出

输出格式 输出内容
%v 值的默认格式表示
%+v 类似 %v,但输出结构体时会添加字段名
%#v 值的 Go 语法表示
值的类型的 Go 语法表示
%t 单词 true 或 false
%b 表示为二进制
%c 该值对应的 unicode 码值
%d 表示为十进制
%8d 表示该整型长度是 8,不足 8 则在数值前补空格;如果超出 8,则以实际为准
%08d 表示该整型长度是 8,不足 8 则在数值前补 0;如果超出 8,则以实际为准
%o 表示为八进制
%q 该值对应的单引号括起来的Go语言语法字符字面值,必要时会采用安全的转义表示
%x 表示为十六进制,使用 a~f
%X 表示为十六进制,使用 A~F
%U 表示为 unicode 格式:U+1234,等价于 U+%04X
%b 无小数部分、二进制指数的科学计数法,如 -123456p-78
%e (=%.6e)有 6 位小数部分的科学计数法,如 -1234.456e+78
%E 科学计数法,如 -1234.456E+78
%f (=%.6f)有 6 位小数部分,如 123.456123
%F 等价于 %f
%g 根据实际情况采用 %e 或 %f 格式(获得更简洁、准确的输出)
%G 根据实际情况采用 %E 或 %F 格式(获得更简洁、准确的输出)
%s 直接输出字符串或者字节数组
%q 该值对应的双引号括起来的Go语法字符串字面值,必要时会采用安全的转义表示
%x 每个字节用两字符十六进制数表示,使用 a~f
%X 每个字节用两字符十六进制数表示,使用 A~F
展开查看示例代码

package main
import "fmt"
func main() {
	str := "steven"
	fmt.Printf("%T, %v \n", str, str)
	var a rune = '一'
	fmt.Printf("%T, %v \n", a, a)
	var b byte = 'b'
	fmt.Printf("%T, %v \n", b, b)
	var c int32 = 98
	fmt.Printf("%T, %v \n", c, c)
	var flag bool
	fmt.Printf("%T, %t \n", flag, flag)
	flag = true
	fmt.Printf("%T, %t \n", flag, flag)
	fmt.Printf("%T, %d \n", 123, 123)
	fmt.Printf("%T, %5d \n", 123, 123)
	fmt.Printf("%T, %05d \n", 123, 123)
	fmt.Printf("%T, %b \n", 123, 123)
	fmt.Printf("%T, %o \n", 123, 123)
	fmt.Printf("%T, %c \n", 97, 97)
	fmt.Printf("%T, %q \n", 97, 97)
	fmt.Printf("%T, %x \n", 123, 123)
	fmt.Printf("%T, %X \n", 123, 123)
	fmt.Printf("%T, %U \n", '一', '一')
	fmt.Printf("%b \n", 123.123456)
	fmt.Printf("%f \n", 123.1)
	fmt.Printf("%.2f \n", 123.125456)
	fmt.Printf("%e \n", 123.123456)
	fmt.Printf("%E \n", 123.123456)
	fmt.Printf("%.1e \n", 123.123456)
	fmt.Printf("%F \n", 123.123456)
	fmt.Printf("%g \n", 123.123456)
	fmt.Printf("%G \n", 123.123456)
	var value complex64 = 2.1 + 12i
	value2 := complex(2.1, 12)
	fmt.Println(real(value))
	fmt.Println(imag(value))
	fmt.Println(value2)
	arr := []byte{'x', 'y', 'z', 'z'}
	fmt.Printf("%s \n", "欢迎访问微学苑")
	fmt.Printf("%q \n", "欢迎访问微学苑")
	fmt.Printf("%x \n", "欢迎访问微学苑")
	fmt.Printf("%X \n", "欢迎访问微学苑")
	fmt.Printf("%T, %s \n", arr, arr)
	fmt.Printf("%T, %q \n", arr, arr)
	fmt.Printf("%T, %x \n", arr, arr)
	fmt.Printf("%T, %X \n", arr, arr)
}

  iota

iota 是特殊常量值,是一个系统定义的可以被编译器修改的常量值。iota 只能被用在常量的赋值中,在每一个 const 关键字出现时,被重置为 0,然后每出现一个常量,iota 所代表的数值会自动增加 1。iota 可以理解成常量组中常量的计数器,不论该常量的值是什么,只要有一个常量,那么 iota 就加 1。

package main
import "fmt"
const (
    a = iota
    b = iota
    c = iota
)
func main() {
    fmt.Println(a, b, c)
}

常量组中如果不指定类型和初始值,则与上一行非空常量的值相同。所以上述的枚举可以简写,如下所示:

package main
import "fmt"
const (
    a = iota
    b
    c
)
func main() {
    fmt.Println(a, b, c)
}

  运算符

运算符 描述 实例
+ 相加 A+B 输出结果 30
- 相减 A-B 输出结果 -10
* 相乘 A*B 输出结果 200
/ 相除 B/A 输出结果 2
% 求余 B%A 输出结果 0
++ 自增 A++ 输出结果 11
-- 自减 A-- 输出结果 9
== 检查两个值是否相等,如果相等返回 True 否则返回 False (A == B) 为 False
!= 检查两个值是否不相等,如果不相等返回 True否则返回 False (A != B) 为 True
> 检查左边值是否大于右边值,如果是返回 True否则返回 False (A > B) 为 False
< 检查左边值是否小于右边值,如果是返回 True 否则返回 False (A < B) 为 True
>= 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False (A >= B) 为 False
<= 检查左边值是否小于等于右边值,如果是返回 True否则返回 False (A <= B) 为 True
&& 逻辑 AND 运算符。如果两边的操作数都是 True,则条件 True,否则为 False (A && B) 为 False
! 逻辑 NOT 运算符。如果条件为 True,则逻辑 NOT 条件 False,否则为 True !(A && B) 为 True
& 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进制位相与 (A&B) 结果为 12,二进制为 0000 1100
按位或运算符“
^ 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进制位相异或,当两对应的二进制位相异时,结果为 1 (A^B) 结果为 49,二进制为 0011 0001
<< 左移运算符“<<”是双目运算符。左移 n 位就是乘以 2 的 n 次方。其功能是把“<<”左边的运算数的各二进制位全部左移若干位,由“<<”右边的数指定移动的位数,高位舍弃,低位补 0 (A<<2) 结果为 240,二进制 1111 0000
>> 右移运算符“>>”是双目运算符。右移 n 位就是除以 2 的 n 次方。其功能是把“>>”左边的运算数的各二进制位全部右移若干位,“>>”右边的数指定移动的位数 (A>>2) 结果为 15,二进制为 0000 1111
= 简单的赋值运算符,将一个表达式的值赋给一个左值 C=A+B 将 A+B 表达式结果赋值给 C
+= 相加后再赋值 C+=A 等于 C=C+A
-= 相减后再赋值 C-=A 等于 C=C-A
*= 相乘后再赋值 C*=A 等于 C=C*A
/= 相除后再赋值 C/=A 等于 C=C/A
%= 求余后再赋值 C%=A 等于 C=C%A
<<= 左移后赋值 C<<=2 等于 C=C<<2
>>= 右移后赋值 C>>=2 等于 C=C>>2
&= 按位与后赋值 C&=2 等于 C=C&2
^= 按位异或后赋值 C^=2 等于 C=C^2
| = 按位或后赋值 C | =2 等于 C=C | 2

    运算符优先级

优先级 运算符
7 ^ !
6 * / % << >> & &^
5 + -
4 == != < <= >= >
3 <-
2 &&
1 | |

  Go和C++相比所具有的区别

  • 布尔类型不能接受其他类型的赋值,也不支持自动或强制的类型转换。
    Go语言是强类型语言,变量类型一旦确定,就不能将其他类型的值赋值给该变量。
var b bool
b = 1           // 编译错误
b = bool(1) // 编译错误
b = (1!=0)   // 编译正确

由于强类型的缘故,Go语言在进行布尔值真假判断时,对值的类型有严格限制,不同类型的值不能直接使用==或!=运算符进行比较,否则就会报错。同样,!运算符也不能作用于非布尔类型值。

b := (false == 0); // cannot convert 0 (type untyped number) to type bool invalid operation: false == 0 (mismatched types bool and int)
  • 在Go语言中,不允许字符串转 int!!
    但是Go支持数据类型转换的有:
    • 浮点型与整型之间的转换
    • 整数类型转字符串类型
      这种类型的转换,其实相当于 byte 或 rune 转 string。int 数值是 ASCII 码的编号或 unicode 字符集的编号,转成 string 就是根据字符集,将对应编号的字符查找出来。当该数值超出 unicode 编号范围,则转成的字符串显示为乱码。例如,19968 转 string,就是“一”。
      备注:
      ASCII 字符集中数字的十进制范围是 48~57;
      ASCII 字符集中大写字母的十进制范围是 65~90;
      ASCII 字符集中小写字母的十进制范围是 97~122;
      unicode 字符集中汉字的范围是 4e00~9fa5,十进制范围是 19968~40869。
  • switch
    • switch 语句执行的过程是自上而下的,直到找到 case 匹配项,匹配项中无须使用 break,因为Go语言中的 switch 默认给每个 case 自带 break。因此匹配成功后不会向下执行其他的 case 分支,而是跳出整个 switch。可以添加 fallthrough(中文含义是:贯穿),强制执行后面的 case 分支。fallthrough 必须放在 case 分支的最后一行。如果它出现在中间的某个地方,编译器就会报错。
    • switch 后的表达式可以省略,默认是 switch true。

参考

Go安装包下载
GoLand下载
安装并免费使用Pychram专业版(学生/教师)
Go安装与Goland破解永久版
Go语言(Golang)教程
Go Lang 异或符
ASCII
千峰教育 go语言视频教程