GoLang语言入门
简介
GoLang(也被称为Go)是一门由Google开发的开源编程语言。它在许多方面都非常优秀,具有以下特点:
高性能、高并发:Go语言通过轻量级的线程(goroutine)和通信原语(channel)实现高效的并发编程,适合构建高性能的分布式系统。 语法简单、学习曲线平缓:Go的语法设计简洁,易于理解,没有繁琐的特性和复杂的用法,初学者可以快速上手。 丰富的标准库:Go拥有一个强大的标准库,涵盖了网络、文件处理、加密、文本处理等多个领域,开发者可以直接使用这些库来提高开发效率。 完善的工具链:Go提供了一套全面的工具,包括格式化工具、测试工具、性能分析工具等,方便开发者进行代码管理和优化。 静态链接:Go语言的编译器将所有依赖打包为一个可执行文件,简化了部署和交付过程。 快速编译:Go的编译速度很快,对于大型项目也能快速完成编译,提高了开发效率。 跨平台:Go可以在各种操作系统上运行,开发者可以在不同平台上编译和运行相同的代码。 垃圾回收:Go拥有自动内存管理,内置垃圾回收机制,开发者不需要手动管理内存,减少了出现内存泄漏的可能性。
基础语法
HelloWorld
package main
import "fmt"
func main() {
fmt.Println("HelloWorld!")
}
定义变量
Go语言中的基本数据类型包括:
- 布尔类型:bool
- 字符串类型:string
- 整数类型:int, int8, int16, int32, int64
- 无符号整数类型:uint, uint8, uint16, uint32, uint64, uintptr
- 字节类型:byte(uint8的别名)
- Unicode字符类型:rune(int32的别名)
- 浮点数类型:float32, float64
- 复数类型:complex64, complex128
package main
import "fmt"
func main() {
var a = 100 // 使用var关键字声明变量,编译器自动推断类型
fmt.Println("a =", a)
c := 'A' // 使用:=短变量声明,编译器自动推断类型
fmt.Println("c =", c)
var b float64 = 64.648 // 显式声明变量类型
fmt.Println("b =", b)
const name = "stacker" // 常量声明
fmt.Println("name =", name)
}
if - else流程控制语句
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v = %g\n", v, lim)
}
// 这里开始就不能使用 v 了
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
for循环
在Go语言中,for循环可以用于多种情况。
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
package main
import "fmt"
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
package main
func main() {
for {
// 循环体
}
}
switch分支结构
Go语言的switch语句与C、Java等语言有所不同。Go的switch默认是带有break的,即匹配到一个分支后会自动跳出switch,不会继续执行其他分支。如果需要贯穿多个分支,可以使用fallthrough
关键字实现。
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.\n", os)
}
}
数组
package main
import "fmt"
func main() {
var a [2]string
a[0] = "Hello"
a[1] = "World"
fmt.Println(a[0], a[1])
fmt.Println(a)
primes := [6]int{2, 3, 5, 7, 11, 13}
fmt.Println(primes)
}
切片*
切片是Go中重要的数据结构,可以看作是数组的一种引用。切片提供了对数组的动态访问,更加灵活和方便。
package main
import "fmt"
func main() {
primes := [6]int{2, 3, 5, 7, 11, 13}
var s []int = primes[1:4]
fmt.Println(s)
}
使用make函数创建切片:
package main
import "fmt"
func main() {
a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[:2]
printSlice("c", c)
d := c[2:5]
printSlice("d", d)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n",
s, len(x), cap(x), x)
}
使用append函数向切片追加元素:
package main
import "fmt"
func main() {
var s []int
printSlice(s)
// 添加一个空切片
s = append(s, 0)
printSlice(s)
// 这个切片会按需增长
s = append(s, 1)
printSlice(s)
// 可以一次性添加多个元素
s = append(s, 2, 3, 4)
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
map
map是Go语言中的一种关联数据类型,也称为字典或哈希表。它由一系列键值对组成,每个键值对表示一个映射关系。
package main
import "fmt"
type Vertex struct {
Lat, Long float64
}
var m map[string]Vertex
func main() {
m = make(map[string]Vertex)
m["Bell Labs"] = Vertex{
40.68433, -74.39967,
}
fmt.Println(m["Bell Labs"])
}
range
range用于遍历数组、切片、字符串、map等数据结构。它返回索引和元素的值。
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
package main
import "fmt"
func main() {
pow := make([]int, 10)
for i := range pow {
pow[i] = 1