Go HelloWorld-1
入门篇😀
环境配置
安装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语言视频教程
本文链接:https://WinterStarHu.github.io/post/go-helloworld-1/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!