Go 语言入门指南:基础语法和常用特性解析
基础语法
如何配置环境可点击here(仅供参考)
补充概念
GOROOT 是 Golang 安装目录的路径。它指定了 Go 编译器、标准库和其他相关工具所在的位置
GOPATH 是 Golang 工作区的路径,它是一个或多个目录的路径列表。Go工作区用于存放用户自己编写的Golang代码、下载的第三方库等
Hello World
-
创建项目
-
在项目目录下创建一个helloWorldDemo文件夹
-
在文件夹下创建main.go
main.go在Goland编辑器中会默认归于对应文件夹名的package
比如上述创建出的main.go会归于package helloWorldDemo
需将package helloWorldDemo改为package main
Golang主要通
过main包中的main方法启动程序和项目
- 编写代码
package main
import (
"fmt" //用于格式化输入和输出。
//它提供了一系列函数,用于将数据以不同的格式打印到控制台、将数据格式化成字符串,以及从标准输入读取格式化的数据等操作。
)
func main() {
fmt.Println("hello world")
}
- 运行代码
方法一
在控制台终端进入对应main.go的文件目录,通过go run main.go运行程序
方法二
在控制台终端进入对应main.go的文件目录,通过go build生成二进制文件,然后通过./可执行文件名运行
方法三
简单快捷的在Goland中点击main方法旁边的绿色三角形箭头直接运行
格式化动词
fmt包中的格式化动词有很多种,用于不同类型的数据输出。
整数类型
%d:以十进制形式输出整数
%b:以二进制形式输出整数
%o:以八进制形式输出整数
%x或%X:以十六进制形式输出整数
浮点数类型
%f:以小数形式输出浮点数,默认精度是 6 位小数
%e或%E:以科学计数法输出浮点数
字符串类型
%s:输出字符串
%q:输出用双引号括起来的字符串,其中的特殊字符会被转义
其他类型
%p:用于输出指针的值,以十六进制形式显示内存地址
%t:输出布尔值,true或false
%T:输出值的类型
变量和常量
常量
常量声明:const用于声明常量。常量是在程序运行过程中其值不能改变的量
常量作用域:在函数内部声明的常量,其作用域仅限于该函数内部;在函数外部声明的常量,其作用域是整个包
package main
import "fmt"
const globalConstant = 50 //全局变量
func main() {
const PI float64 = 3.14159 //声明了一个名为PI的常量,类型为浮点数(float64)
const anotherConstant = 10 //声明了一个名为anotherConstant的常量,由golang自动推断类型
const localConstant = 30 //局部变量
fmt.Println("局部常量:", localConstant)
fmt.Println("全局常量:", globalConstant)
}
变量
变量声明:var用于声明变量。变量是一个可以存储数据的容器,其值可以在程序运行过程中改变
变量作用域:变量的作用域取决于其声明的位置。在函数内部声明的变量,其作用域仅限于该函数内部;在函数外部(如在包级别)声明的变量,其作用域是整个包(在该包内的所有函数都可以访问,前提是符合访问权限规则)
package main
import "fmt"
var globalVariable int = 20 //全局变量
var (
a int
b string = "bbbbbb"
c bool
) //多个变量声明
func main() {
var localVariable int = 10 //局部变量
unusedVar := false //可以成功定义变量,但是在函数中未被使用会报错。Golang不允许有未被使用的变量出现
fmt.Println("局部变量:", localVariable)
fmt.Println("全局变量:", globalVariable)
}
基础数据类型
Golang有多种基本数据类型。
整数类型(int、int8、int16、int32、int64)
浮点数类型(float32、float64)
布尔类型(bool)
字符串类型(string)
.....
类型转换:不同类型的数据在需要时可以进行转换。例如,将一个整数转换为浮点数可以使用float64(i)(假设i是一个整数)这样的表达式来实现
控制流语句
条件语句(if-else)
用于根据条件执行不同的代码块
package main
import "fmt"
var age1 = 20
var age2 = 16
func main() {
if age1 >= 18 {
fmt.Println("成年人")
} else {
fmt.Println("未成年人")
}
if age2 >= 18 {
fmt.Println("成年人")
} else {
fmt.Println("未成年人")
}
}
循环语句
golang所有的循环都通过for循环来实现
package main
import "fmt"
func main() {
//普通for循环
for i := 0; i < 10; i++ {
fmt.Println(i)
}
//while循环
j := 0
for j < 5 {
fmt.Println(j)
j++
}
//类似java的foreach
numbers := []int{1, 2, 3, 4, 5}
for _, number := range numbers {
fmt.Println(number)
}
}
常用特性
切片(Slice)
切片是对数组的一个连续片段的引用,它是一种动态大小的数据结构。切片可以方便地对数据进行操作,如添加、删除元素等
创建和初始化:可以通过对数组进行切片操作来创建切片,也可以使用make函数创建
package main
import "fmt"
func main() {
// 通过数组创建切片
arr := [5]int{1, 2, 3, 4, 5}
slice1 := arr[1:4] // 遵循左闭右开
// 使用make函数创建切片
slice2 := make([]int, 3)
slice := []int{1, 2, 3}
//切片支持添加元素(使用append函数)
newSlice := append(slice, 4)
//切片操作(获取子切片)
subSlice := newSlice[1:3] // 遵循左闭右开
fmt.Println(slice1) //[2 3 4]
fmt.Println(slice2) //[0 0 0]
fmt.Println(newSlice) //[1 2 3 4]
fmt.Println(subSlice) //[2 3]
}
映射(Map)
映射(也称为字典或哈希表)是一种无序的键 - 值对数据结构。它可以用于存储和检索基于键的数据。对应java的HashMap
创建和初始化:可以使用make函数创建映射,也可以使用字面量进行初始化
package main
import "fmt"
func main() {
// 使用make函数创建
m := make(map[string]int)
// 使用字面量初始化
n := map[string]int{"apple": 1, "banana": 2}
m["orange"] = 3 //添加键值对
value, exists := m["apple"] //返回值和键是否存在(bool)
if exists {
fmt.Println("apple的值为", value)
}
delete(m, "banana")//删除键值对
fmt.Println(m)
fmt.Println(n)
}
指针(Pointer)
指针是存储变量内存地址的变量。在 Golang 中,指针可以用于在函数之间传递变量的地址,从而可以修改函数外部变量的值。
声明和操作:通过*运算符来声明指针类型,通过&运算符获取变量的地址
package main
func main() {
var num int = 10
var p *int = &num
*p = 20
}
协程(Goroutine)
协程是 Go 语言中轻量级的线程。可以使用go关键字来启动一个协程。例如,go func() { fmt.Println("协程i执行") }()会启动一个新的协程来执行匿名函数中的代码。协程之间可以并发执行,提高程序的性能和效率。
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup //等待协程计数器
for i := 0; i < 10; i++ {
wg.Add(1) // 计数器加一
go func(i int) {
defer wg.Done() // defer关键字修饰的语句会在函数结束后执行
//一个函数多个defer,按照后进先出的顺序执行
fmt.Printf("协程%d执行\n", i)
}(i)
}
wg.Wait() //等待ing
}