Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信

目录标题

  • 一、Json序列化与反序列化
    • 1. 序列化
    • 2. 反序列化
  • 二、Goto语法
  • 三、Tcp Socket
    • 1. 单客户端发送信息到服务端
    • 2. 服务端客户端通信

一、Json序列化与反序列化

1. 序列化

		package mainimport ("encoding/json""fmt")type Person struct {Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email"`}func main() {person := Person{Name:  "LoisMay",Age:   21,Email: "1711031006@qq.com",}// 序列化为 JSON 字节数组jsonData, err := json.Marshal(person)if err != nil {fmt.Println("JSON 序列化错误:", err)return}// 打印 JSON 字符串fmt.Println(string(jsonData))// {"name":"LoisMay","age":21,"email":"1711031006@qq.com"}}

2. 反序列化

		func main() {Data := []byte(`{"name":"LoisMay","age":21,"email":"1711031006@qq.com"}`)// 反序列化为 Person 结构体var person Personerr := json.Unmarshal(Data, &person)if err != nil {fmt.Println("JSON 反序列化错误:", err)return}// 打印反序列化后的对象fmt.Println(person.Name)fmt.Println(person.Age)fmt.Println(person.Email)}

二、Goto语法

        goto 语句可以用来实现程序的无条件跳转但在实际开发中,应该谨慎使用它,因为滥用 goto 可能会导致代码结构混乱和可读性降低。package mainimport "fmt"func main() {var n = 30fmt.Println("LoisMay")if n > 20 {goto func1}fmt.Println("LoisMays")fmt.Println("LoisMayss")fmt.Println("LoisMaysss")func1:fmt.Println("666")fmt.Println("777")fmt.Println("888")}//	LoisMay//	666//	777//	888

三、Tcp Socket

1. 单客户端发送信息到服务端

Server.go

		package mainimport ("bufio""fmt""net""strings")func process(conn net.Conn) {defer conn.Close()reader := bufio.NewReader(conn)for {fmt.Printf("Server is waiting for client message from %s:\n", conn.RemoteAddr().String())massage, err := reader.ReadString('\n')if err != nil {fmt.Printf("Client exited with error: %v\n", err)return}massage = strings.Trim(massage, "\r\n")fmt.Printf("Received message from client: %s\n", massage)// 服务端回复消息response := "Server received: " + massage + "\n"_, err = conn.Write([]byte(response))if err != nil {fmt.Printf("Error sending response to client: %v\n", err)return}}}func main() {fmt.Println("Server is Listen")listen, err := net.Listen("tcp", "0.0.0.0:8888")if err != nil {fmt.Println("Listen err=", err)return}defer listen.Close()for {fmt.Println("Waiting for client connection")conn, err := listen.Accept()if err != nil {fmt.Println("Accept err=", err)} else {fmt.Printf("Accepted connection from client: %v\n", conn.RemoteAddr().String())}go process(conn)}}

Client.go

		package mainimport ("bufio""fmt""net""os""strings")func main() {conn, err := net.Dial("tcp", "0.0.0.0:8888")if err != nil {fmt.Println("Client dial error:", err)return}defer conn.Close()reader := bufio.NewReader(os.Stdin)for {fmt.Print("Enter message: ")message, err := reader.ReadString('\n')if err != nil {fmt.Println("ReadString error:", err)break}message = strings.Trim(message, "\r\n")if message == "exit" {fmt.Println("Client is exiting")break}_, err = conn.Write([]byte(message + "\n"))if err != nil {fmt.Println("Connection write error:", err)break}response, err := bufio.NewReader(conn).ReadString('\n')if err != nil {fmt.Println("Read response error:", err)break}fmt.Println("Server response:", response)}}

2. 服务端客户端通信

server.go

		package mainimport ("bufio""fmt""net""os""strings")func handleClient(conn net.Conn) {defer conn.Close()reader := bufio.NewReader(conn)writer := bufio.NewWriter(conn)for {// 读取客户端消息message, err := reader.ReadString('\n')if err != nil {fmt.Printf("Error reading client message: %v\n", err)return}message = strings.Trim(message, "\r\n")fmt.Printf("Received message from client: %s\n", message)// 回复客户端消息response := "Server received: " + message + "\n"_, err = writer.WriteString(response)if err != nil {fmt.Printf("Error sending response to client: %v\n", err)return}writer.Flush()// 检查客户端是否要退出if message == "exit" {fmt.Println("Client is exiting")return}}}func main() {fmt.Println("Server is listening")listener, err := net.Listen("tcp", "0.0.0.0:8888")if err != nil {fmt.Println("Listen error:", err)return}defer listener.Close()for {fmt.Println("Waiting for client connection")conn, err := listener.Accept()if err != nil {fmt.Println("Accept error:", err)break}fmt.Println("Client connected:", conn.RemoteAddr().String())go handleClient(conn)// 启动一个 goroutine 处理服务端发送消息go func(c net.Conn) {reader := bufio.NewReader(os.Stdin)writer := bufio.NewWriter(c)for {// 从控制台读取输入fmt.Print("Enter message: ")input, _ := reader.ReadString('\n')input = strings.Trim(input, "\r\n")// 发送消息给客户端_, err := writer.WriteString(input + "\n")if err != nil {fmt.Printf("Error sending message to client: %v\n", err)return}writer.Flush()// 检查服务端是否要退出if input == "exit" {fmt.Println("Server is exiting")return}}}(conn)}// 阻塞主线程,使服务端持续运行<-make(chan struct{})}

Client.go

		package mainimport ("bufio""fmt""net""os""strings")func handleServer(conn net.Conn) {defer conn.Close()reader := bufio.NewReader(conn)writer := bufio.NewWriter(conn)for {// 读取服务端消息message, err := reader.ReadString('\n')if err != nil {fmt.Printf("Error reading server message: %v\n", err)return}message = strings.Trim(message, "\r\n")fmt.Printf("Received message from server: %s\n", message)// 检查服务端是否要退出if message == "exit" {fmt.Println("Server is exiting")return}// 从控制台读取输入fmt.Print("Enter message: ")input, _ := reader.ReadString('\n')input = strings.Trim(input, "\r\n")// 发送消息给服务端_, err = writer.WriteString(input + "\n")if err != nil {fmt.Printf("Error sending message to server: %v\n", err)return}writer.Flush()// 检查客户端是否要退出if input == "exit" {fmt.Println("Client is exiting")return}}}func main() {conn, err := net.Dial("tcp", "127.0.0.1:8888")if err != nil {fmt.Println("Client dial error:", err)return}fmt.Println("Connected to server")go handleServer(conn)// 从控制台读取输入reader := bufio.NewReader(os.Stdin)for {fmt.Print("Enter message: ")input, _ := reader.ReadString('\n')input = strings.Trim(input, "\r\n")// 发送消息给服务端_, err = conn.Write([]byte(input + "\n"))if err != nil {fmt.Printf("Error sending message to server: %v\n", err)return}// 检查客户端是否要退出if input == "exit" {fmt.Println("Client is exiting")break}}conn.Close()}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/186045.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【c趣编程】输入一个整数,判断其有几位

目录 1题目要求&#xff1a; 2解题思路&#xff1a; 3代码如下所示&#xff1a; 4运行代码如下&#xff1a; 5总结&#xff1a; 1题目要求&#xff1a; 只用一个scanf输出一串数&#xff0c;不可以一个一个的输入并计数&#xff0c;那样太浪费时间了。 C语言是一门面向过…

GoLong的学习之路(二十二)进阶,语法之并发(go最重要的特点)(channel的主要用法)

这一章是接上一章内容继续&#xff0c;上一章说到协程也就是goroutine&#xff0c;如何使用它&#xff0c;这一张是讲一种数据结构。当然这个章节的数据结构非常重要。可以说这个数据结构就是为了方便协程&#xff0c;才制作出来的。 单纯地将函数并发执行是没有意义的。函数与…

MySQL -- 用户管理

MySQL – 用户管理 文章目录 MySQL -- 用户管理一、用户1.用户信息2.创建用户3.删除用户4.远端登录MySQL5.修改用户密码6.数据库的权限 一、用户 1.用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中&#xff1a; host&#xff1a; 表示这个用户可以从…

河南开放大学与电大搜题微信公众号:携手共进,助力学习之路

作为河南省内颇具影响力和声誉的高等教育机构之一&#xff0c;河南开放大学一直致力于提供优质的教育资源和灵活的学习方式&#xff0c;以满足广大学习者的需求。而在这个追求知识的时代&#xff0c;学习者们尤其需要一个便捷、高效的工具来辅助学习。电大搜题微信公众号应运而…

持续集成交付CICD:安装Gitlab Runner(从节点)

目录 一、实验 1.选择Gitlab Runner版本 2.安装Gitlab Runner&#xff08;第一种方式&#xff1a;交互式安装&#xff09; 3.安装Gitlab Runner&#xff08;第二种方式&#xff1a;非交互式安装&#xff09; 二、问题 1.如何查看Gitlab版本 一、实验 1.选择Gitlab Runne…

Web APIs——BOM和延迟函数setTimeout

1、window对象 1.1 BOM&#xff08;浏览器对象模型&#xff09; BOM&#xff08;Browser Object Model&#xff09;是浏览器对象模型 window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性&#xf…

windows11使用docker部署安装minio

时间 2023-11-08 windows11使用docker部署安装minio 目录 1.docker 下载镜像2.docker安装镜像3.访问控制台4.安装问题解决5.使用教程 1.docker 下载镜像 调整镜像源到国内&#xff0c;否则会很慢 docker pull minio/minio2.docker安装镜像 设置用户名和密码时需要注意&…

【好书推荐】计算机考研精炼1000题——考研408不可或缺

《计算机考研精炼1000题》简介 本书根据最新《全国硕士研究生招生考试计算机学科专业基础考试大纲》编写。参考过去十多年的真题&#xff0c;本书精心编排了单项选择题和综合应用题&#xff0c;共约1000道&#xff08;分为上下两册&#xff0c;共24章。上册&#xff08;1&#…

Spring基础(1):两个概念

最近看了点Spring的源码&#xff0c;于是来稍微扯一扯&#xff0c;希望能帮一部分培训班出身的朋友撕开一道口子&#xff0c;透透气。 广义上的Spring指的是Spring整个项目&#xff0c;包含SpringBoot、SpringCloud、SpringFramework、SpringData等等&#xff0c; 本系列文章…

sql学习

因为之前sql学的太烂了&#xff0c;想整理一下 一.什么是 SQL&#xff1f; SQL 是用于访问和处理数据库的标准的计算机语言。 SQL 指结构化查询语言SQL 使我们有能力访问数据库SQL 是一种 标准计算机语言 二.SQL 能做什么&#xff1f; SQL 面向数据库执行查询SQL 可从数据库…

17. 机器学习 - 随机森林

Hi&#xff0c;你好。我是茶桁。 我们之前那一节课讲了决策树&#xff0c;说了决策树的优点&#xff0c;也说了其缺点。 决策树实现起来比较简单&#xff0c;解释解释性也比较强。但是它唯一的问题就是不能拟合比较复杂的关系。 后来人们为了解决这个问题&#xff0c;让其能…

华为荣耀软开秋招面经问题整理

一、八股 1.linux常用命令 Linux常用命令&#xff08;面试题&#xff09;_linux常用命令面试题-CSDN博客 常用命令、系统命令、打包命令、vim、开关机命令 2.socket通信调用api过程 TCP UDP 3.进程和线程的区别 进程是系统进行资源分配和调度的基本单元&#xff0c;线程…

初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)

接上次博客&#xff1a;初阶JavaEE&#xff08;14&#xff09;表白墙程序-CSDN博客 Cookie 和 Session 你还记得我们之前提到的Cookie吗&#xff1f; Cookie是HTTP请求header中的一个属性&#xff0c;是一种用于在浏览器和服务器之间持久存储数据的机制&#xff0c;允许网站…

【Linux】初识进程地址空间

❤️前言 大家好&#xff01;这里是好久没有营业的大懒虫lion&#xff0c;今天要和大家聊的内容是我最近新学习的关于进程地址空间的相关知识。 正文 当我们使用C/C语言进行内存管理时&#xff0c;经常会接触到这样的一张图片&#xff1a; 它常常被我们称作程序地址空间&#…

Netty 是如何利用EventLoop实现千万级并发的

经过前面几篇文章的介绍&#xff0c;我们掌握了 Netty 的 5 个核心组件&#xff0c;但是有了这 5 个核心组件 Netty 这个工厂还是无法很好的运转&#xff0c;因为缺少了一个最核心的组件&#xff1a;EventLoop&#xff0c;它 是 Netty 中最最核心的组件&#xff0c;也是 Netty …

使用C++的QT框架实现五子棋

最近有点无聊正好想玩五子棋&#xff0c;那就实现一下这个游戏吧&#xff0c;网上的五子棋逻辑又长又复杂&#xff0c;我这个逻辑还是蛮简单的&#xff0c;展示如下&#xff08;检测函数在最后&#xff09; 这是一个简单的五子棋&#xff0c;今天就了解一下这个游戏的思路&…

机器学习——回归

目录 一、线性回归 1、回归的概念&#xff08;Regression、Prediction&#xff09; 2、符号约定 3、算法流程 4、最小二乘法&#xff08;LSM&#xff09; 二、梯度下降 梯度下降的三种形式 1、批量梯度下降&#xff08;Batch Gradient Descent,BGD&#xff09;&#xff…

【2023.11.6】OpenAI发布会——近期chatgpt被攻击,不能使用

OpenAI发布会 写在最前面发布会内容GPT-4 Turbo 具有 128K 上下文函数调用更新改进了指令遵循和 JSON 模式可重现的输出和对数概率更新了 GPT-3.5 Turbo 助手 API、检索和代码解释器API 中的新模式GPT-4 Turbo 带视觉DALLE 3文字转语音 &#xff08;TTS&#xff09;收听语音样本…

[unity]切换天空盒

序 unity是自带天空盒的&#xff1a; 但有的时候不想用自带的。怎么自定义&#xff1f;如何设置&#xff1f; 官方文档 Unity - Manual: The Lighting window (unity3d.com) 相关窗口的打开方法 天空盒对应的选项 实际操作 从标准材质球到天空盒材质球 新建一个材质球&…

Powerpoint不小心被覆盖?PPT误删文件如何恢复?

PowerPoint不小心删除了&#xff0c;这可能是众多学生和工作人员最头痛的事情了。PPT被覆盖或误删可能意味着几个小时的努力付之东流。那么PPT覆盖的文档要如何救回来呢&#xff1f;小编将会在本篇文章中为大家分享几个解决方案&#xff0c;使PPT文档覆盖还原操作成为可能&…