Go语言入门
1、Go 语言的安装
1.1、下载
Go 语言官方下载地址:golang.google.cn/dl/
选择最新版的windows环境下,.msi后缀点击下载
下载好后,无脑点击下一步,可以更改安转位置到D盘。
1.2、配置环境
1.3、下载go插件
vscode下载go的插件
2、第一个Go语言代码
go
// 导入 fmt 包并调用其中的 Println 函数输出 "Hello, world!"
// 导入类
package main // 表明这个文件属于main包,是程序的入口文件
// 导入 fmt 包
import "fmt" //标准库的包,输入输出,格式化字符串的函数
// 主函数
func main() {
fmt.Println("Hello, world!")
}
3、Go语言的特色
高性能、高并发、语法简单、快速编译
4、Go语言的基础语法
4.1、变量声明
在Go语言中,变量的声明使用var
关键字。可以指定变量的类型,也可以让编译器根据初始值自动推断类型。未初始化的变量不能使用,因为Go语言强调变量在使用前必须被初始化。
csharp
// 声明变量并初始化
var a string = "initial value"
var b, c int = 1, 2
fmt.Println(a, b, c)
4.2、常量
常量在Go语言中使用const
关键字声明,一旦赋值就不能更改。常量可以是数字、字符串或者布尔值。
c
// 声明常量
const s string = "constant"
const h = 5000000
fmt.Println(s, h)
4.3、数据类型
Go语言是静态类型语言,拥有丰富的内置类型。每种类型都有明确的位大小和内存布局。
- 布尔型 :
bool
,只有两个值true
和false
。 - 整型 :
int
、int8
、int16
、int32
、int64
和uint
、uint8
、uint16
、uint32
、uint64
等。 - 浮点型 :
float32
、float64
。 - 复数型 :
complex64
、complex128
。 - 字符串型 :
string
,以UTF-8编码表示。
go
// 各种数据类型的示例
var isTrue bool = true
var myInt int = 42
var myFloat float64 = 3.1415
var myComplex complex128 = 5 + 10i
var myString string = "Hello, Go!"
4.4、控制流程
Go语言的控制流程包括if
语句和for
循环,没有while
循环,但可以通过for
循环实现相同的功能。switch
语句是另一种多分支选择结构。
go
// if 语句
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
// for 循环
for i := 0; i < 3; i++ {
fmt.Println(i)
}
// switch 语句
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
fmt.Printf("%s.\n", os)
}
5、数组与切片
5.1、数组
数组是固定长度的序列,一旦声明,其长度不可改变。
less
// 声明一个整型数组
var arr [5]int
arr[0] = 1
arr[1] = 2
fmt.Println(arr)
// 使用数组字面量初始化
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
5.2、切片
切片是数组的抽象表示,允许动态地处理不同长度的序列。切片比数组更加灵活,是Go语言中处理集合数据的首选方式。
go
// 创建切片
s := make([]string, 2)
s[0] = "a"
s[1] = "bcd"
fmt.Println(s)
// 切片追加
s = append(s, "efg", "hi")
fmt.Println(s)
// 切片复制
s2 := make([]string, len(s))
copy(s2, s)
fmt.Println(s2)
6、映射(Map)
映射是Go语言中存储键值对的数据结构,通过make
函数创建。
go
// 创建映射
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println("m:", m)
// 访问映射
r, ok := m["one"]
fmt.Println("r:", r, "ok:", ok)
// 删除映射中的元素
delete(m, "one")
fmt.Println("m after delete:", m)
7、函数
函数是执行特定任务的代码块,可以有参数和返回值。
csharp
// 定义一个函数
func add(a, b int) int {
return a + b
}
// 调用函数
fmt.Println("Add result:", add(3, 4))
8、结构体与方法
8.1、结构体
结构体是自定义数据类型,用于将多个变量组合成一个单一类型。
go
// 定义结构体
type user struct {
name string
password string
}
// 实例化结构体
u := user{"Bob", "secret"}
fmt.Println(u)
8.2、方法
方法是一种特殊的函数,它与结构体关联,可以访问结构体的字段。
go
// 定义结构体方法
func (u *user) check(password string) bool {
return u.password == password
}
// 调用方法
fmt.Println("Check result:", u.check("secret"))
9、接口与面向对象
9.1、接口
接口在Go语言中是一种类型,包含一组方法签名。它定义了一组方法,任何实现了这些方法的类型都实现了该接口。
go
// 定义接口
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
9.2、面向对象
虽然Go语言没有类和继承,但可以通过接口和组合来实现面向对象编程的特性,如封装、继承和多态。
10、错误处理
错误处理是Go语言中处理异常情况的重要机制,它使用error
类型来表示错误。
go
// 错误处理
func findUser(users []user, name string) (*user, error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("user not found")
}
// 使用错误处理
u, err := findUser([]user{{"Bob", "secret"}}, "Bob")
if err != nil {
fmt.Println(err)
} else {
fmt.Println("User found:", u.name)
}