Go 语言以其简洁语法和高性能并发著称。涵盖环境配置、基础语法、数据结构、结构体与接口、错误处理及模块管理。重点解析 Goroutine 调度模型、Channel 通信机制及 CSP 模式,辅以切片、Map 等常用集合操作实例。适合有 Java 或 C 背景的开发者快速上手,掌握现代 Go 编程范式。
乱七八糟3 浏览
Go 语言快速入门与核心知识点总结
一、初步了解 Go 语言
(一)Go 语言诞生的主要问题和目标
Go 语言的设计初衷是为了解决现代软件开发中的几个核心挑战:
多核硬件架构:随着多核处理器成为主流,并行计算变得普遍。传统语言在处理多核时往往缺乏原生支持,而 Go 通过轻量级的协程(goroutine)和通道(channel)机制,让并发编程变得简单。开发者可以轻松创建数千个并发执行的协程,无需担心线程管理的复杂性。
在该目录下执行 go run hello.go ZYF,运行结果为 Hello World ZYF。
(二)基本程序结构编写学习
1. 变量
变量声明:使用 var 关键字,例如 var x int。
类型推断:使用 := 操作符,Go 会自动推断类型,例如 y := 5。
零值:未初始化的变量会被赋予零值(数字为 0,布尔为 false,字符串为空)。
多变量声明:可同时声明多个变量,例如 var a, b, c int。
新建 fib_test.go,利用斐波那契数列练习变量交换:
package variables
import"testing"funcTestFibList(t *testing.T) {
a := 1
b := 1
t.Log(a)
for i := 0; i < 5; i++ {
t.Log(" ", b)
tmp := a
a = b
b = tmp + a
}
}
funcTestExchange(t *testing.T) {
a := 1
b := 2// 使用 Go 特有的多重赋值进行交换
a, b = b, a
t.Log(a, b)
}
package main
import"fmt"type Person struct {
FirstName string
LastName string
Age int
}
type Shape interface {
Area() float64
}
type Circle struct {
Radius float64
}
func(c Circle) Area() float64 {
return3.14 * c.Radius * c.Radius
}
funcadd(a, b int)int {
return a + b
}
type Operation func(int, int)intfuncmain() {
fmt.Println("整数类型")
var x int = 10var y int64 = 100
fmt.Println(x, y)
fmt.Println("浮点数类型")
var a float32 = 3.14var b float64 = 3.14159265359
fmt.Println(a, b)
fmt.Println("布尔类型")
var isTrue bool = true
fmt.Println(isTrue)
fmt.Println("字符串类型")
str1 := "Hello, "
str2 := "Go!"
concatenated := str1 + str2
fmt.Println(concatenated)
fmt.Println("切片类型")
numbers := []int{1, 2, 3, 4, 5}
fmt.Println(numbers)
subSlice := numbers[1:4]
fmt.Println(subSlice)
fmt.Println("映射类型")
ages := map[string]int{
"Alice": 25,
"Bob": 30,
}
ages["Charlie"] = 22
fmt.Println(ages)
fmt.Println("结构体类型")
person := Person{
FirstName: "John",
LastName: "Doe",
Age: 30,
}
fmt.Println(person)
fmt.Println("接口类型")
var shape Shape
circle := Circle{Radius: 5}
shape = circle
fmt.Println("Circle Area:", shape.Area())
fmt.Println("函数类型")
var op Operation
op = add
result := op(10, 5)
fmt.Println("Addition:", result)
fmt.Println("通道类型")
messages := make(chanstring)
gofunc() {
messages <- "Hello, Go!"
}()
msg := <-messages
fmt.Println(msg)
fmt.Println("指针类型")
x = 10var ptr *int
ptr = &x
fmt.Println("Value of x:", x)
fmt.Println("Value stored in pointer:", *ptr)
*ptr = 20
fmt.Println("Updated value of x:", x)
}
类型转换说明
Go 支持显式类型转换,例如 float64(10)。对于不兼容类型,编译器不会自动转换。类型别名转换需注意兼容性。
package main
import"fmt"funcmain() {
var x int = 10var y float64 = float64(x)
fmt.Println(y)
type Celsius float64type Fahrenheit float64
c := Celsius(25)
f := Fahrenheit(c*9/5 + 32)
fmt.Println(f)
}
4. 运算符
Go 支持算术、逻辑、比较、位运算等。特别需要注意的是按位清除运算符 &^,它用于将某些位置上的位清零。
示例:
package operator
import (
"fmt""testing"
)
const (
Readable = 1 << iota
Writable
Executable
)
funcTestOperatorBasic(t *testing.T) {
a := 10
b := 5
fmt.Println("Sum:", a+b)
fmt.Println("AND:", true && false)
fmt.Println("Equal:", a == b)
}
funcTestBitClear(t *testing.T) {
a := 7// 0111
a = a &^ Readable
a = a &^ Executable
t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable)
}
5. 条件语句
if 语句:基于条件执行代码块。
switch 语句:Go 的 switch 可自动匹配第一个满足条件的分支,无需 break。
示例:
package condition
import (
"fmt""testing"
)
funcTestConditionIf(t *testing.T) {
age := 18if age < 18 {
fmt.Println("You are a minor.")
} elseif age >= 18 && age < 60 {
fmt.Println("You are an adult.")
} else {
fmt.Println("You are a senior citizen.")
}
}
funcTestConditionSwitch(t *testing.T) {
dayOfWeek := 3switch dayOfWeek {
case1:
fmt.Println("Monday")
case2:
fmt.Println("Tuesday")
case3:
fmt.Println("Wednesday")
default:
fmt.Println("Weekend")
}
}
6. 循环语句
for 循环:Go 只有 for 循环,没有 while。支持初始化、条件和后置语句。
range 循环:用于迭代数组、切片、映射等。
示例:
package loop
import (
"fmt""testing"
)
funcTestLoopFor(t *testing.T) {
for i := 1; i <= 5; i++ {
fmt.Println("Iteration:", i)
}
}
funcTestLoopForRange(t *testing.T) {
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}
}