特点
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
基本类型
| 类型 | 描述 |
|---|---|
| uint8 / uint16 / uint32 / uint64 | 无符号 8 / 16 / 32 / 64位整型 |
| int8 / int16 / int32 / int64 | 有符号8 / 16 / 32 / 64位整型 |
| float32 / float64 | IEEE-754 32 / 64 位浮点型数 |
| complex64 / complex128 | 32 / 64 位实数和虚数 |
| byte | 类似 uint8 |
| rune | 类似 int32 |
| uintptr | 无符号整型,用于存放一个指针 |
声明
变量名: 由字母、数字、下划线组成,其中首字母不能是数字
语句/表达式: 不需要加;
如果变量没有初始化 数值类型默认0 布尔类型默认false 字符串默认""
package main //指明此文件属于哪个包
import "fmt" //引人包
func main() { //函数
var x int = 27 //声明了一个int类型的变量
fmt.Println(x) //输出
var name = "小明" //如果没有指定类型,可以通过变量的初始值判断类型
fmt.Println(name) //输出
y := 27 //相当于 var y int = 27
fmt.Println(y)
//匿名变量: 就是一个下划线 _ 被称为空白标识符,它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃
a, _ := example()
_, b := example()
fmt.Println(a, b)
}
func example() (int, int) {
return 10, 20
}
循环语句
在go中只有for这一种循环语句
循环控制语句有:break,continue,goto
package main
import "fmt"
func main() {
//只有for循环
for j := 1; j < 9; j++ {
fmt.Println(j)
}
//循环控制语句
//break: 跳出循环
//continue: 跳过当前循环执行下一次循环语句
//goto: 无条件转移到过程中指定的行,如下
var a int = 0
LOOP:
for a < 5 {
if a == 2 {
a = a + 1
goto LOOP
}
fmt.Printf("%d\n", a)
a++
}
}
条件语句
if if-else switch select
package main
import "fmt"
func main() {
//if
if 7%2 == 0 {
fmt.Println("123")
}
//if-else
if 7%2 == 0 {
fmt.Println("123")
} else {
fmt.Println("456")
}
a := 2
//switch
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
default:
fmt.Println("else")
}
//select
}
指针
package main
import "fmt"
func main() {
var a *int //声明指针变量
var b int = 20 //声明实际变量
a = &b //指针变量的存储地址
fmt.Println(a) //输出地址
fmt.Println(*a) //输出值
//空指针: 当一个指针被定义后没有分配到任何变量时,它的值为 nil
}
数组
package main
import "fmt"
func main() {
//定义一个一维数组
//var nums [5]float32
//定义并初始化一个一维数组
var nums1 = [5]float32{1.0, 2.5, 3.3, 4.6, 9.9} //方式一
//nums2 := [5]float32{1.0, 2.5, 3.3, 4.6, 9.9} //方式二
//var nums3 = [...]float32{1.0, 2.5, 3.3, 4.6, 9.9} //方式三
//nums4 := [...]float32{1.0, 2.5, 3.3, 4.6, 9.9} //方式四
//nums5 := [5]float32{1.0, 2.5} //方式五 部分初始化
//获取数组长度
var length = len(nums1)
fmt.Println(length)
//定义数组指针
var a = &nums1
//通过数组指针迭代数组的元素
for i, v := range a {
fmt.Println(i, v)
}
}
结构体
package main
// Books 定义一个结构体类型
type Books struct {
title string
auth string
}
func main() {
var book Books
book.title = "Go 语言入门"
book.auth = "xiaoming"
}
函数
package main
import "fmt"
func main() {
fmt.Println(example2(2, 1))
}
/*
example2 函数名称
(a int, b int) 参数列表
(int, int) 返回值类型
return a + b, a - b 函数体
*/
func example2(a int, b int) (int, int) {
return a + b, a - b
}
关键字
| 关键字 | 作用 |
|---|---|
| import | 导入相应的包文件 |
| package | 创建包文件,用于标记该文件归属哪个包 |
| chan | channal,通道 |
| var | 变量控制,用于简短声明定义变量(:=符号只能在函数内部使用,不能全局使用) |
| const | 常量声明,任何时候const和var都可以同时出现 |
| func | 定义函数和方法 |
| interface | 接口,是一种具有一组方法的类型,这些方法定义了interface的行为 |
| map | 哈希表 |
| struct | 定义结构体 |
| type | 声明类型,取别名 |
| for | for是go中唯一的循环结构 |
| break | 中止,跳出循环 |
| continue | 继续下一轮循环 |
| select | 选择流程,可以同时等待多个通道操作 |
| switch | 多分枝选择,上文中已经详细介绍过它的用法 |
| case | 和switch配套使用 |
| default | 用于选择结构的默认选型 |
| defer | 用于资源释放,会在函数返回之前进行调用 |
| if | 分支选择 |
| else | 和if配套使用 |
| go | 通过go func()来开启一个goroutine |
| goto | 跳转至标志点的代码块,不推荐使用 |
| range | 用于遍历slice类型数据 |
| return | 用于标注函数返回值 |
总结、感悟
与java相比的不同之处在于:
if后面的判断条件不需要加()
for循环条件不需要加()
switch不需要加break