速成班!去繁存简,一文让你学会go语言基础!!

简介: 速成班!去繁存简,一文让你学会go语言基础!!

注意
此篇适用于有一定编程语言基础的朋友阅读。
简介
Go(Golang)是Google在2007开发的一种开源编译型编程语言。是一种静态类型语言。Go语言具有“兼具Python等动态语言的开发速度和C或C++等编译型语言的性能和安全性”。
开发工具
开发工具有很多。可以使用Sublime、Textmate、Notepad++、Atom、IntelliJ IDEA等工具,本人这里是使用的IDEA,关于最新版Idea的安装和破解请阅读:《IntelliJ IDEA 2023.2.5安装教程》。
数据类型
类型
说明
描述
uint
无符号整型
uint、uint8、uint16、uint32、uint64等
int
有符号整型 int、int8、int16、int32等
byte
uint8的别名
等同uint8
rune
int32的别名
等同int32,表示一个unicode码
uintptr
指针
无符号整型,用于存放一个指针是一种无符号的整数类型
float
浮点型
float32、float64
string
字符串
"字符串"
complex 实数和虚数
complex64、complex128
Struct
结构化类型 可以包含字段和方法的结构体
Channel
通道类型
chan
Map
映射类型
键值对集合
Slice
切片类型
动态大小的字符序列。
Interface
接口类型
定义一组方法集的类型
func

函数类型 定义函数
[]arr
数组类型
[]string
const
常量类型
定义常量

类型定义

(1) var + 类型名称 + 数据类型

var num int16
(2) var ( 类型名称 + 数据类型 ) 。可以同时定义多个

var (
Name string
Age int16
Id string
)
(3)推导定义。 类型名称 + := 此方法只适用于方法等局部变量中。

aa := "string"
函数定义:

(1)func+空格 + 函数名称 +([参数]) ([返回值])+{函数体}

// 无参数与返回值
func method() {
fmt.Print("测试")
}

// 此参数与返回值
func Add(a int, b int) int {
return a + b
}

// 多返回值
func bb(a int, b int) (int, int) {
return a, b
}

// 返回值定义
func method2(a int, b int) (r int, w int) {
r=a
w=b
return
}

结构定义:首字母大写公共变量,小写为私有变量
type User struct {
Name string
Age int16
Id string
}

接口定义:
type IUser interface {
Method1()
Method2()
}

方法定义:注意方法与函数的不同,方法是与结构体绑定的行为。

func (user User) Method1() {

}

func (user User) Method2() {

}
控制流程

(1)if else

//单if
i := 3
if i == 3 {

}

//if else 格式

if i == 2 {

} else {

}

//if else if else 格式

if i == 1 {

} else if 3 == i {

} else {

}
(2) switch 语句:与case 配合使用。

func main() {
i := 2
switch i {
case 1:
//do something
case 2:
//do
default:

}
}
(3)for 循环

for i := 0; i <10; i++ {

}

numbers:=[]int {1,2,3,4,5,6}
for idx, value := range numbers {
fmt.Print(idx,value)
}
(4)defer : 执行滞后,在函数执行完成前执行。多个defer 遵循“先建后行”,最先定义的,倒叙执行。

defer func() {
fmt.Print("a")
}()

defer func() {
fmt.Print("b")
}()
defer func() {
fmt.Print("c")
}()
defer func() {
fmt.Print("d")
}()

//执行顺序为 d -> c -> b-> a

数组、切片、映射(键值对)

数组:数组是一个数据集合。定义时,需要指定其长度和数据类型。索引从0开始。

var arr [4]string
arr[0] = "aaaa"
arr[1] = "bbbb"
arr[2] = "aaaa"
arr[3] = "bbbb"
切片:底层数组的连续片段。需要用make()方法创建。

var arr =make([]string,4)
arr[0] = "aaaa"
arr[1] = "bbbb"
arr[2] = "aaaa"
arr[3] = "bbbb"
//追加
arr = append(arr, "ccc")
//复制
copy(targetArr,sourceArr)

映射(键值对):

映射是通过键来访问的无序元素编组。映射也被称为关联数组、字典或散列。格式定义:var mapV = make(map[keyType]valueType)

func Test() {
var foods = make(map[string]string)

//添加元素
foods["a"] = "红苹果"
foods["b"] = "黄香蕉"
foods["c"] = "橙橙子"

for key, value := range foods {
fmt.Print("key: "+key, " value:"+value+"\n")
}

//删除元素
delete(foods, "a")
fmt.Println("删除后,打印")
for key, value := range foods {
fmt.Print("key: "+key, " value:"+value+"\n")
}

}
公有与私有

go语言中约定,首字母大写为公有,首字母小写为私有。公有和私有的区别在于是否可被其他类或包使用。公有的属性定义是可以在其他地方进行引用(有的地方成为导出)。

type People struct {
Name string //公有
age int16 //私有
sex string //私有
}
指针引用与值引用

go语言在赋值过程中,是值赋值(副本),指针是指向内存地址的引用。用&表示,如&p,用表示数据,如p

var p test.People

p = test.People{
Name: "people name",
Age: 21,
Sex: "M",
}
p2 := p
fmt.Printf("%+v\n", p)
fmt.Printf("%+v\n", p2)
fmt.Printf("%p\n", &p)
fmt.Printf("%p\n", &p2)

p3 := &p
fmt.Printf("%+v\n", p)
fmt.Printf("%+v\n", *p3)
fmt.Printf("%p\n", &p)
fmt.Printf("%p\n", p3)
异常处理

//定义
err := errors.New("有些东西错误了")
if err!=nil {
fmt.Println(err)
}

//格式输出
name,age :="name error ","age error"
err := fmt.Errorf("the error : %v %v", name, age)
if err != nil {
fmt.Println(err)
}

//函数返回
func Test(i int) (int, error) {
if i != 0 {
return -1, fmt.Errorf("传入不是 0, %v", i)
}
return 1, nil
}
并发(Goroutine)

并发:同时处理众多事情。并行:同时做很多事情,在某一个时间点,处理多项事情。go语言中,用关键字 go + 执行体 表示。

//引用函数
go test.Add(1, 32)

//直接定义匿名函数
go func(a int, b int) {
fmt.Println(a + b)
}(32,23)

通道(channel)

通道(channel)是Go 语言中一种特殊的数据类型,通道本身就是并发安全的,可以通过它在多个 goroutine 之间传递数据。通道是Go 语言编程理念:“Do not communicate by sharing memory; instead, share memory by communicating”(不要通过共享数据来通信,而应该通过通信来共享数据。)

在Go语言中,通道(channel)是用于协程(goroutine)之间进行通信的重要机制。通道可以是有缓冲的(buffered)或无缓冲的(unbuffered)。

通道的缓冲大小决定了可以在通道中存储的元素个数。在创建通道时,可以指定通道的缓冲大小。

// 创建一个通道
ch := make(chan int)

// 开启一个goroutine向通道发送数据
go func() {
for i := 0; i < 15; i++ {
ch <- i // 发送数据到通道
time.Sleep(time.Second) // 每发送一个数据暂停一秒
}
close(ch) // 通道发送完毕后关闭
}()

// 使用range遍历通道,直到通道关闭
for v := range ch {
fmt.Println(v) // 打印通道接收到的值
}

单向通道:

在以参数传递过程中,可以根据需求进行控制,通道的只读与只写控制,由双向通道转为单向通道。

var c1 chan<- type_name
var c1 <-chan type_name

// 在函数体内只允许写入
func WriteChan(i chan<- int) {
i <- 1
i <- 2
i <- 3
}

// 在函数体内只允许读取
func ReadChan(i <-chan int) {
for v := range i {
fmt.Println(v)
}
}
缓存通道

func
main
() {
ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)
}
无缓冲通道的相关特性

发送操作:无缓冲通道上的发送操作将会阻塞,直到另一个goroutine在对应的通道上执行接收操作,这时值传送完成,两个goroutine都可以继续执行
接收操作:如果接收操作比发送操作先执行,接收方goroutine将阻塞,直到另一个goroutine在同一个通道上发送一个值
无缓冲通道的通信方式为"同步方式"
使用无缓冲通道进行的通信导致发送和接收goroutine同步化
因此,无缓冲通道也称为同步通道。当一个值在无缓冲通道上传递时,接收值后发送方goroutine才被再次唤醒
并发问题
goroutine的运行顺序是不一定的,因此当两个或多个goroutine并发地访问同一份数据的时候,就需要对访问进行排序,避免程序的执行发生问题。

好了,关于Go语言的基础篇,馆长就先介绍到这里。有兴趣的朋友可关注"IT技术馆"公众号,了解更多好玩且实用的技术分享。谢谢。

相关文章
|
8月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
8月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
2月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
2月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
3月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
3月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
281 0
|
4月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
5月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
131 10
|
8月前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
203 3
Go 语言入门指南:切片
|
8月前
|
算法 安全 Go
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
168 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了