【Go语言快速上手(六)】管道, 网络编程,反射,用法讲解

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Go语言专栏

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习更多Go语言知识
  🔝🔝


在这里插入图片描述

1. 前言

本篇文章是GO语言快速上手系列的最后一篇文章, 学完本章后你就掌握了GO语言常用的所有知识和语法, 在未来使用GO语言时你可能还会遇见一些奇怪的语法,但是别害怕, GO就是为了简洁而生,你有Java或CPP的基础,学什么都很快的

本章重点:

本篇文章着重讲解GO中的管道的概念以及用法. 还会讲解GO语言是怎样实现网络编程的, 会通过一个例子来讲解. 最后会讲解GO语言的反射机制,以及反射的语法.由于GO语言没有传统意义上的泛型编程概念,所以学习反射还是有必要的


2. 初识管道

说白了管道就是一个数据结构: 队列

在这里插入图片描述

管道的定义:

var 变量名 chan 管道类型
var channel chan int
管道可通过make进行初始化
channel = make(chan int,3)//管道可以存放三个int类型变量

管道是有类型的,int类型管道只能写入int类型数据,并且管道是引用类型,必须初始化后,即make后才能使用它.除此之外,管道的用法比较奇特,通过左箭头<-来向管道存放或取出数据

var intchan chan int = make(chan int,3)
//向管道中存放数据
intchan<-10
intchan<-20
num := 30
intchan<-num
//从管道中取出数据
data1 := <-intchan
data2 := <-intchan
data3 := <-intchan

显而易见,插入管道的顺序为10,20,30,所以取出数据时,data123分别对应10,20,30. 并且从管道中取出数据的意思就是把它拿出来. 除此之外,使用范围for进行遍历时,打印出数据后, 管道中的数据也会被取出.

var intchan chan int = make(chan int,3)
//向管道中存放数据
intchan<-10
intchan<-20
num := 30
intchan<-num
for v:= range intchan{
	fmt.Println("value: ",v)
}

管道的for-range循环只有value,没有key,并且如果你直接这样写代码,会报错, 因为for-range会一直遍历管道,并不会在乎管道中是否还存在数据. 所以在使用for-range之前应该先用close函数将管道关闭

  • 不关闭管道, for-range会一直取数据
  • 关闭管道后, 不可写入,但可读取

3. 管道的高级用法

管道可以声明为只读或只写性质:

var intchan1 chan<- int //只写
var intchan2 <-chan int //只读

除此之外,如果你学过多路转接select,那么这对于你来说应该很轻松.当有多个管道时,需要解决选择问题,select的作用就是在多个管道中随机公平的选择一个来执行.这是通过select和case来实的,case后面必须进行IO操作,不能是等值, 随机去选取一个IO操作.若select时迟迟没有管道就绪,那么就会一直阻塞在select处.加上default语句,可以避免这种阻塞发生

package main

import (
	"fmt"
	"time"
)
func main() {
	intchan1 := make(chan int, 10)
	intchan2 := make(chan string, 10)
	intchan3 := make(chan float32, 10)
	go func() {//匿名函数
		time.Sleep(time.Second * 5)
		intchan1 <- 10
	}()
	go func() {
		time.Sleep(time.Second * 4)
		intchan2 <- "zbcdefg"
	}()
	go func() {
		time.Sleep(time.Second * 3)
		intchan3 <- 3.14
	}()
	select {
	case v1 := <-intchan1:
		fmt.Printf("intchan1: %v", v1)
	case v2 := <-intchan2:
		fmt.Printf("intchan2: %v", v2)
	case v3 := <-intchan3:
		fmt.Printf("intchan3: %v", v3)
	default:
		fmt.Println("防止select被阻塞")
	}
}

在这里插入图片描述


4. GO中的网络编程

GO语言有net包直接进行网络编程,十分的方便,不像CPP一样进行网络编程时需要调用系统调用来完成.话不多说,直接上手代码示例:

服务器端:

  1. 监听一个地址和端口

  2. 接受客户端的连接

  3. 读取和写入数据

package main  
import (  
    "bufio"  
    "fmt"  
    "net"  
    "os"  
)  
func main() {  
    // 监听TCP端口  
    listener, err := net.Listen("tcp", ":8080")  
    if err != nil {  
        fmt.Println(err)  
        return  
    }  
    defer listener.Close()  
    for {  
        // 接受新的连接  
        conn, err := listener.Accept()  
        if err != nil {  
            fmt.Println(err)  
            continue  
        }  
        //到来连接时,让协程去执行读写操作
        go handleRequest(conn) // 使用goroutine处理连接  
    }  
}  

func handleRequest(conn net.Conn) {  
    defer conn.Close()  
    // 读取数据  
    reader := bufio.NewReader(conn)  
    message, err := reader.ReadString('\n')  
    if err != nil {  
        fmt.Println(err)  
        return  
    }  
    fmt.Print("Message received: ", string(message))  
    // 发送数据  
    conn.Write([]byte("Message received!\n"))  
}

如果你清楚TCP通信的基本流程,那么你一定知道,net.Listen函数就是封装了系统调用listen,而方法listener.Accept封装了系统调用accept,返回的conn也就是就绪的连接fd

客户端:

  1. 连接到服务器

  2. 读取和写入数据

package main  
import (  
    "bufio"  
    "fmt"  
    "net"  
    "os"  
)  
func main() {  
    // 连接到TCP服务器  
    conn, err := net.Dial("tcp", "127.0.0.1:8080")  
    if err != nil {  
        fmt.Println(err)  
        return  
    }  
    defer conn.Close()  
    // 发送数据  
    fmt.Fprintf(conn, "Hello, Server!\n")  
    // 读取响应  
    reader := bufio.NewReader(conn)  
    message, err := reader.ReadString('\n')  
    if err != nil {  
        fmt.Println(err)  
        return  
    }  
    fmt.Print("Message from server: ", string(message))  
}

对Linux熟悉的同学一眼就能看出,这个fprintf就是向文件描述符conn中输入数据的,都是封装了C,所以说我建议学GO语言要先把基础知识打牢固


5. GO语言中的反射

GO不直接支持泛型编程,但通过反射可以弥补这一缺陷,话不多说,直接上概念:

在这里插入图片描述
代码示例:

func test(i interface{}){
	//1.调用typeof函数,返回reflect.Type类型数据
	reType := reflect.TypeOf(i)
	fmt.Println(reType)
	//2. 调用valueof函数,返回reflect.value类型数据
	reValue := reflect.ValueOf(i)
	fmt.Println(reValue)
	//注,revalue是valueof类型,不能直接进行运算
	//想要获取revalue的值要调用revalue.Int()方法
}

func main(){
	//对基本类型进行反射
	var num int = 100
	test(num)
}

反射要通过传递空接口来实现,不知各位是否还记得在讲接口时说到,任意类型都实现的空接口,也就是说任意类型的变量都可以传递给空接口,接口和reflect.value类型可以相互转换,转换关系如下:

在这里插入图片描述

获取变量的类别有两种方式:

reflect.Type.kind()
reflect.Value.kind()

注意,类别和类型是两种概念,类别是指bool,int,int32,int64,struct,map这种大分类,而变量的类型是小分类. 除此之外,还可以对结构体类型进行反射:

func test(i interface{}){
	//1.调用typeof函数,返回reflect.Type类型数据
	reType := reflect.TypeOf(i)
	fmt.Println(reType)
	//2. 调用valueof函数,返回reflect.value类型数据
	reValue := reflect.ValueOf(i)
	fmt.Println(reValue)
	fmt.Println(reType.kind())
}

type stu struct{
	Name string
	Age int
}

func main(){
	//对结构体类型进行反射
	student := stu{
		Name : "张三"
		Age : 18
	}
	test(student)
}

在这里插入图片描述

更多关于反射的使用手册,大家可以自行问GPT


6. 总结以及拓展

GO语言快速上手这一系列的文章就结束了,但GO语言的学习之旅还远远没有结束, 本系统文章只讲解了很常用的GO语法,在实际生产生活中,如果遇见了诸如像context类型的新概念,大家可以自行去学习,感谢您的阅读,再见

  • 110
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 98
    评论
### 回答1: Python编程快速上手是一本非常适合初学者的编程入门教材,本书总共分为16章,内容涵盖了Python的基础语法、常用数据结构、函数与模块、文件操作、异常处理等主题。这本书采用了简明扼要的语言和清晰的示例,使读者能够迅速掌握Python编程的基础知识。 首先,书中的第一章介绍了Python的基础知识,包括Python的起源和特点,如何安装Python以及如何使用Python解释器。接着,第二章讲解Python的基本语法,包括变量、运算符、条件语句、循环语句等,这些是编程的基础,读者可以很快掌握。 然后,书中的第三章讲解Python的数据结构,包括列表、元组、字典、集合等,这些数据结构在Python编程中非常重要。接下来,第四章介绍了Python的函数与模块,包括如何定义函数、如何使用内置函数以及如何导入和使用模块。 书中的第五和第讲解了文件的操作和异常处理,这些是编程中常用的技巧。此外,还有第七章介绍了正则表达式,第八和第九章介绍了网络编程和多线程编程,第十章介绍了数据库的操作,第十一章介绍了图形界面编程,第十二章介绍了Web开发,第十三章介绍了数据分析和机器学习,第十四章介绍了游戏开发,第十五章介绍了图像和声音处理,最后一章介绍了如何发布和分发自己的Python程序。 总之,Python编程快速上手这本书内容丰富全面,适合想要快速学习Python编程的初学者,通过阅读这本书,读者可以迅速掌握Python编程的基础知识,并能够在实际项目中灵活运用。同时,书中的示例丰富实用,对于加深编程理解和提升实践能力也非常有帮助。推荐给那些想要快速上手Python编程的读者。 ### 回答2: 《Python编程快速上手PDF》是一本适合初学者入门的Python编程书籍。Python作为一种简单易学的编程语言,被广泛应用于数据分析、Web开发、人工智能等领域。这本书的目的是帮助读者快速掌握Python的基本语法和常用库,从而能够快速编写简单的程序。 《Python编程快速上手PDF》首先介绍了Python的基本语法,包括变量、数据类型、运算符、控制流等内容。通过具体的示例代码,读者可以学习如何定义变量、执行基本运算以及使用条件语句和循环语句来控制程序流程。 接下来,本书引入了Python的常用库,如NumPy、Pandas、Matplotlib等。这些库提供了丰富的功能和工具,可以方便地进行数据分析、处理和可视化。通过学习这些库的用法,读者可以掌握如何使用Python进行数据处理和分析的基本方法。 此外,本书还介绍了如何使用Python进行Web开发、爬虫等应用。通过学习Django、Flask等Web框架的基本使用方法,读者可以了解如何搭建一个简单的Web应用。同时,本书还介绍了使用Python进行爬虫的基本原理和方法,读者可以学习如何爬取网页内容并进行数据提取和分析。 总之,《Python编程快速上手PDF》是一本帮助读者快速入门Python编程的实用书籍。通过学习本书的内容,读者可以快速掌握Python的基本语法和常用库的使用方法,从而能够使用Python编写简单的程序和进行一些基本的数据处理和分析。无论是初学者还是有一定编程基础的读者,都可以通过阅读本书快速掌握Python编程。 ### 回答3: 《Python编程快速上手.pdf》是一本针对初学者编写的Python编程入门书籍。本书主要以实际项目为例,介绍了Python编程的基础知识和常用技巧。 首先,本书从Python的基本概念开始介绍,如变量、数据类型、运算符等。然后,逐渐引入Python的控制结构,如条件语句、循环语句等,并配以简单易懂的示例代码,帮助读者理解和掌握这些概念。 接着,本书讲解Python的函数、模块和文件操作等重要内容。通过学习函数的定义和调用,读者可以学会如何编写可重用的代码;通过了解模块的概念和引入,读者可以利用Python强大的标准库和第三方库进行更高级的功能实现;通过学习文件的读取和写入操作,读者可以处理各种文件格式并进行数据处理。 此外,本书还介绍了Python面向对象编程的基础知识,如类、对象、继承等。通过学习面向对象编程的思想,读者可以更好地组织和管理代码,并在实际项目中更好地实现功能。 最后,本书还涵盖了Python的一些高级主题,如异常处理、多线程、网络编程等。这些知识点将帮助读者更好地编写稳定、高效的Python程序。 总结来说,通过《Python编程快速上手.pdf》这本书,读者可以快速入门Python编程,并具备一定的编程能力。无论是对于初学者还是有一定编程经验的人来说,都是一本不可多得的编程学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 98
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杭电码农-NEO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值