Hello, World
go
代码解读
复制代码
package main // 声明包名
import "fmt" // 导入 fmt 包,提供格式化和打印函数
func main() { // 定义 main 函数
fmt.Println("Hello, World!") // 调用 fmt 包的 Println 函数打印字符串
}
- Go 语言的程序入口是 main 包中的 main 函数。
- 使用 import 关键字导入需要的包,如 fmt 包提供格式化输出的函数。
- fmt.Println 函数打印字符串到标准输出。
- Go 语言每行代码行尾不需要加分号。
- Go 语言不允许函数的左括号单独成行。
- 要执行GO语言程序,可以使用
go run
命令,如go run hello.go
- 要编译GO语言程序,可以使用
go build
命令,生成一个可执行文件,如go build hello.go
- GO语言有多种运算符,如算术运算符
+ - * / % ++ --
、关系运算符== != > < >= <=
、逻辑运算符&& || !
等。 - GO语言有多种流程控制语句,如条件语句
if
、switch
、select
,循环语句for
、range
,跳转语句goto
、break
、continue
等。 - GO语言支持并发编程,可以使用
go
关键字创建一个协程(goroutine),使用chan
关键字创建一个通道(channel),实现多个协程之间的通信和同步。
变量、指针和赋值
- 变量声明使用 var 关键字,常量声明使用 const 关键字。
- 变量的定义形式为:var name [type] = [expression],其中 type 和 expression 可以省略一个,但不能同时省略。
- 变量的类型默认值为零值,如数字类型为 0,布尔类型为 false,字符串类型为 “”,接口、切片、指针、映射、通道、函数等类型为 nil。
- 变量可以使用 := 操作符进行声明并赋值,但只能在函数内部使用。
- Go 语言支持指针类型,使用 & 操作符获取变量的地址,使用 * 操作符获取指针指向的值。
- Go 语言也支持 new 函数创建一个变量,并返回其指针。
- 赋值操作符为 = ,可以进行多重赋值,如 m, n = n, m 实现变量交换。
- Go 语言也提供了自增、自减和 *= , += 等先运算后赋值的操作符。
选择和循环
go
代码解读
复制代码
package main // 声明包名
import "fmt" // 导入 fmt 包,提供格式化和打印函数
func main() { // 定义 main 函数
var score int = 85
if score >= 90 {
fmt.Println("优秀")
} else if score >= 80 {
fmt.Println("良好")
} else if score >= 60 {
fmt.Println("及格")
} else {
fmt.Println("不及格")
}
}
- Go 有 if else 和 switch 语句的条件选择,switch 语句的每个 case 不需要额外的 break。
go
代码解读
复制代码
package main // 声明包名
import "fmt" // 导入 fmt 包,提供格式化和打印函数
func main() { // 定义 main 函数
for i:= 0;i<10; i++{
fmt.Println(i) //打印 0 - 9
}
}
- Go 语言只有 for 循环,可以实现C++的 while 和 do … while 。
- for 循环也可以用 range 函数遍历数组、切片、映射等集合类型。
基本数据类型
- 整型分为有符号和无符号两种,有多种类型,分别对应不同的位数和取值范围。
- 浮点型分为 float32 和 float64 两种类型。
- 复数分为 complex64 和 complex128 两种类型,由实部和虚部组成,可以使用内置的 real 和 imag 函数获取复数的实部和虚部。
- 布尔类型只有两个值:true 和 false,默认值为 false。
- 字符串类型表示一系列字节或字符,可以使用双引号或反引号定义。字符串是不可变的,可以使用 + 操作符进行拼接。字符串可以使用索引访问单个字节或字符(rune),也可以使用 len 函数获取长度。字符串可以转换为 []byte 或 []rune 类型进行更多操作。
数组
- 数组是一种固定长度的序列类型,数组的长度是数组类型的一部分。数组可以使用 var name [length]type 的形式定义,也可以使用字面量初始化。
- 数组是默认按值传递的,如果需要修改原数组,可以使用指针或切片作为参数传递。
- 数组可以使用 len 函数获取长度,也可以使用 range 函数遍历元素。
切片
- 切片是一种动态长度的序列类型,切片由三部分组成:指向底层数组的指针、切片的长度和切片的容量。切片的长度是切片中元素的个数,切片的容量是从切片的起始位置到底层数组的末尾位置的元素个数。
- 切片可以使用 var name []type 的形式定义,也可以使用 make 函数创建指定长度和容量的切片。切片也可以通过数组或其他切片创建,使用 name[start:end] 的形式截取。
- 切片是一种引用类型,传递给函数时,函数可以修改原切片的内容。
- 切片可以使用 len 函数获取长度,cap 函数获取容量,也可以使用 range 函数遍历元素。
- 切片可以使用 append 函数追加元素,如果切片的容量不足,会自动扩容。切片可以使用 copy 函数复制元素,返回复制的元素个数。
映射
- 映射是一种键值对的无序集合类型,映射的键必须是可以比较的类型,如整型、浮点型、字符串、布尔、指针等。映射的值可以是任意类型。
- 映射可以使用 var name map[keyType]valueType 的形式定义,也可以使用 make 函数创建指定容量的映射。映射也可以使用字面量初始化。
- 映射是引用类型,传递给函数时,函数可以修改原映射的内容。
- 映射可以使用 len 函数获取键值对的个数,也可以使用 range 函数遍历键值对。
- 映射可以使用 name[key] = value 的形式添加或修改键值对,也可以使用 delete 函数删除键值对。映射可以使用 name[key] 或 value, ok := name[key] 的形式获取键对应的值,如果键不存在,返回零值。
结构体
-
结构体是一种聚合类型,可以将不同类型的字段组合在一起。结构体可以使用 type name struct { … } 的形式定义,也可以使用字面量初始化。
-
结构体是默认按值传递的,如果需要修改原结构体,可以使用指针作为参数传递。
-
结构体可以使用 . 操作符访问字段,也可以使用 == 和 != 操作符比较两个结构体是否相等(前提是结构体中所有字段都是可比较的类型)。
-
结构体可以嵌入其他结构体或接口类型作为匿名字段,实现类似继承和多态的功能。嵌入的字段可以直接访问,如果有同名字段,则遵循最外层优先原则。
总结
- 简洁的语法:Go语言的语法相对简洁,去除了许多传统C系语言中的冗余特性,如分号自动插入机制减少了不必要的输入,以及不需要在函数声明后加上左括号。这使得Go代码更加清晰易读。
- 强大的标准库:Go拥有丰富的标准库,涵盖了网络编程、文件操作、加密算法等多个领域,这大大简化了开发者的工作,提高了开发效率。
- 静态类型与编译时检查:Go语言是一种静态类型语言,这意呸着在编译阶段就能发现很多错误,如类型不匹配等问题,有助于提高代码质量。同时,Go的编译速度非常快,这使得快速迭代成为可能。
- 高效的并发模型:Go语言通过轻量级线程——goroutine和通道(channel)提供了强大的并发支持。这种模型简单直观,易于理解和使用,极大地降低了并发编程的门槛。
- 垃圾回收机制:Go语言内置了垃圾回收机制,自动管理内存分配与释放,减轻了开发者手动管理内存的压力,减少了因内存泄漏导致的问题。
- 面向对象的特性:虽然Go语言没有传统意义上的类,但是通过结构体和方法可以实现面向对象编程的核心概念,如封装、继承(通过结构体嵌入实现)、多态等。这种方式既保持了语言的简洁性,又不失灵活性。
- 跨平台编译:Go语言支持跨平台编译,允许开发者轻松地为不同操作系统和架构编译程序,这对于开发跨平台的应用来说是一个巨大的优势。