一、初入GO语言
我们先还是看看GO语言的hello world是怎么写的吧
package main
import "fmt"
func main() {
fmt.Println("Hello world!")
}
第一行 :包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如
package main
第二行:引入包,其实就是告诉Go 编译器这个程序需要使用的包,如
import "fmt"
其实就是引入了fmt包第三行 :主函数 整个程序的入口 整个项目
有且只有一个
main函数
- 在 Go 语言里,命名为 main 的包具有特殊的含义。 Go 语言的编译程序会试图把这种名字的包编译为二进制可执行文件。所有用 Go 语言编译的可执行程序都必须有一个名叫 main 的包。一个可执行程序有且仅有一个 main 包。当编译器发现某个包的名字为 main 时,它一定也会发现名为 main()的函数,否则不会创建可执行文件。 main()函数是程序的入口,所以,如果没有这个函数,程序就没有办法开始执行。程序编译时,会使用声明 main 包的代码所在的目录的目录名作为二进制可执行文件的文件名
- 我们话可以看到每行最后没有
;
号 这也是和java不同的地方我们要注意
二、变量
首先我们看看go的数据类型有哪些
Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。
- 基础类型,包括:数字、字符串和布尔型。
- 复合数据类型——数组 和 结构体——是通过组合简单类型,来表达更加复杂的数据结构。
- 引用类型包括指针、切片、字典、函数、通道
变量的申请
- 方式一
var 变量名 数据类型
var a int
a = 1
var a1, a2, a3 int = 1, 2, 3
fmt.Println(a, a1, a2, a3)
可以看到var a int 使用 var 关键字来申请变量 a是变量名 int是数据类型
- 方式二
var 申请变量时 赋值
var b, b2 = 2, 2
fmt.Println(b, b2)
我们可以看到这样 省略了 数据类型 b b2可以根据后面的值来自动推断数据类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jini0sR5-1674191979398)(C:\Users\35886\AppData\Roaming\Typora\typora-user-images\image-20230115120652636.png)]
- 方式三 var省略
c := 3
c1, c2, c3 := 3, 3, 3
fmt.Println(c, c1, c2, c3)
这样的写法最简单 但是只能 申请局部变量
- 其他方式
var (
d int
e string
f bool
)
fmt.Println("d=", d, "e=", e, "f=", f)
三、for循环
在go中只有for循环 没得java中其他的while do-while
for j := 1; j < 11; j++ {
fmt.Println(j)
}
可以看到和java相比 for后面没有() 其他差不多j := 7; j < 9; j++
中 也可以省略也就是可以有以下的几种写法
for{
fmt.Println("死循环")
}
k := 1
for ; k < 10; k++ {
fmt.Println(k)
}
for i := 1; ; i++ {
fmt.Println("死循环")
}
for i := 1; i < 10; {
fmt.Println(i)
i++
}
总之和java差别不是很大
四、条件语句
go语言条件语句有如下几种
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1CCuBLg-1674191979399)(C:\Users\35886\AppData\Roaming\Typora\typora-user-images\image-20230115131637748.png)]
4.1 、if语句
Go 没有三目运算符,所以不支持 ?: 形式的条件判断。
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
当然和for循环一样与java相比也没有(),上面的代码只要有点其他语言的基础也能读懂
注意 else后面的 { 不能换行
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
if num := 9; num < 0 我们还能在if里面 申请变量 ;后面 num < 0 才是真正的判断语句
当然if 也能嵌套如下代码
if num := 9; num < 0 {
if num > -2 {
fmt.Println("11111111111111")
}
} else if num < 10 {
if num > 0 {
fmt.Println("22222222222222")
} else {
fmt.Println("33333333333333")
}
} else {
fmt.Println("44444444444444")
}
4.2、switch 语句
语法如下
switch var1 {
case val1:
// 执行的代码
case val2:
// 执行的代码
case val3:
// 执行的代码
default:
// 执行的代码
}
注意和Java相比 case后面不用加break 当满足case val2的时候并不会在执行下面的 case val3。不同的 case 之间不使用 break 分隔,默认只会执行一个 case
switch 的 default 不论放在哪都是最后执行
值得注意的事 val可以是表达式 也就是说可以替代if语句
a := 1
switch {
case a%2 == 0:
fmt.Println(a % 2)
case a%2 != 0:
fmt.Println(a % 2)
}
运行结果是 1
4.3 、select 语句
select 是 Go 中的一个控制结构,类似于 switch 语句。select 语句只能用于通道操作,每个 case 必须是一个通道操作,要么是发送要么是接收。
如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。
语法
select {
case 通道操作1:
// 执行的代码
case 通道操作2:
// 执行的代码
case 通道操作3:
// 执行的代码
default:
// 所有通道都没有准备好,执行的代码
}