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

目录标题

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

一、Json序列化与反序列化

1. 序列化

		package main
		
		import (
			"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 Person
			err := 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 main

        import "fmt"

        func main() {
            var n = 30
            fmt.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 main
		
		import (
			"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 main
		
		import (
			"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 main
		
		import (
			"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 main
		
		import (
			"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()
		}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用VSCode来查看二进制文件

2023年11月6日&#xff0c;周一下午 目录 方法1&#xff1a;安装插件Binary Viewer然后用vscode打开一个二进制文件&#xff0c;并点击右上角的"HEX"方法2&#xff1a;安装插件Binary然后用vscode打开一个二进制文件&#xff0c;并点击右上角的"B" 方法1&…

2023年【北京市安全员-A证】最新解析及北京市安全员-A证复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年北京市安全员-A证最新解析为正在备考北京市安全员-A证操作证的学员准备的理论考试专题&#xff0c;每个月更新的北京市安全员-A证复审模拟考试祝您顺利通过北京市安全员-A证考试。 1、【多选题】《中华人民共和…

fastspar微生物相关性推断

fastspar 简介 fastspar是基于Sparcc通过C编写的&#xff0c;速度更快&#xff0c;内存消耗更少。sparcc是基于OTU的原始count数&#xff0c;通过log转换和标准化去除传统相对丰度的天然负相关&#xff08;因为所有OTU之和为1&#xff0c;某些OTU丰度高另外一些自然就少&…

【delphi】中 TNetHTTPClient 注意事项

一、TNetHTTPClient 是什么&#xff1f; 用于管理 HTTP 客户端的组件。相当于indy中的TidHTTP控件&#xff0c;是实现HTTP请求的客户端控件。 二、TNetHTTPClient 需要注意什么&#xff1f; 需要注意的是几个Timeout&#xff0c;因为我们使用TNetHTTPClient控件的时候&#x…

【脑机接口 算法】EEGNet: 通用神经网络应用于脑电信号

EEGNet: 神经网络应用于脑电信号 中文题目论文下载&#xff1a;算法程序下载&#xff1a;摘要1 项目介绍2 EEGNet网络原理2.1EEGNet原理架构2.2FBCCA 算法2.3自适应FBCCA算法 3EEGNet网络实现4结果 中文题目 论文下载&#xff1a; DOI: 算法程序下载&#xff1a; 地址 摘要…

踩准AI时代风口,NFPrompt让人人都能成为赚取利润的创作者

★ AI寒武纪时代&#xff0c;抓住风口并不难 众所周知&#xff0c;随着ChatGPT的面世&#xff0c;AI在2023年快速爆发&#xff0c;不少人已经意识到AI将在未来能够影响到我们每个人生活方方面面&#xff0c;同时AI也将打破现有的经济与社会格局。对于普通人来说&#xff0c;如…

1366 - Incorrect string value: ‘\xE5\xB9\xBF\xE5\x85\xB0...‘ for column编码错误

1366 - Incorrect string value: ‘\xE5\xB9\xBF\xE5\x85\xB0…’ for column ‘campus_name’ at row 1 > 查询时间: 0s 原因是数据库创建的时候使用的默认编码latin1&#xff0c;导致表和字段的编码格式都是这种编码&#xff0c;显然这种编码不支持中文。 自己修改了数据库…

肩胛骨筋膜炎怎么治疗最有效

肩胛后背疼痛是平时工作、生活中常见的一类症状&#xff0c;尤其现在随着工作方式和生活习惯的改变&#xff0c;长期伏案工作以及低头看电脑已经成为常态&#xff0c;所以肩胛后背痛出现的频率还是比较高的。常见的原因主要包括&#xff1a;肩胛后背的筋膜炎&#xff0c;最容易…

二叉树OJ练习题(C语言版)

目录 一、相同的树 二、单值二叉树 三、对称二叉树 四、树的遍历 前序遍历 中序遍历 后序遍历 五、另一颗树的子树 六、二叉树的遍历 七、翻转二叉树 八、平衡二叉树 一、相同的树 链接&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; bool isSameTree(…

社区治理进化史!拓世法宝化身“虚拟社工”,点亮智能社区的每一个角落

时光流转、技术猛进&#xff0c;社区不再只是在制度层面作为城市治理的最小单元&#xff0c;更是在民生层面成为政府联系、服务群众的“神经末梢”。城市的脚步越来越匆忙&#xff0c;人们对于社区的服务期待也愈发高涨。面对日益复杂的社区治理和服务需求&#xff0c;我们迫切…

蓝桥杯:分数

题目 思路 等比数列求和&#xff0c;手算然后输出 代码&#xff08;已过&#xff09; #include <iostream> using namespace std; int main() {// 请在此输入您的代码int a1024*1024-1;int b1024*512;cout<<a<<"/"<<b;return 0; }

eclipse的安装与配置详细教程(包括UML插件 汉化 JDK 代码补全 导入导出等)

Eclipse安装与配置详细教程 1.Eclipse安装与配置 1.将JDK与Eclipse这两个软件安装包放在一个文件夹下&#xff0c;方便之后安装使用。 2.安装JDK 在D&#xff1a;LeStoreDownload\Java文件夹下另外新建三个文件夹分别命名为java、jdk和eclipse&#xff08;分别用于Java、jdk…

关于unity中 编辑器相关逻辑的记录

prefab 在场景中 , 用这个方法可以获取它的磁盘路径: [MenuItem("Gq_Tools/↓获取prefab路径")] public static void SaveDecalParameters() { var objs Selection.objects; var obj objs[0] as GameObject; Object parentObject Prefab…

SAP 开发查找增强程序

参考文章https://blog.csdn.net/SAPmatinal/article/details/129987722?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169949816116800225559526%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id16994981611680022555…

关于视频封装格式和视频编码格式的简介

文章目录 简介视频封装格式&#xff08;Video Container Format&#xff09;视频编码格式&#xff08;Video Compression Format&#xff09;两者关系总结webm 格式简介webm视频编码格式webm音频编码格式webm总结 简介 视频封装格式&#xff08;Video Container Format&#x…

2023年【起重机司机(限门式起重机)】新版试题及起重机司机(限门式起重机)找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机司机(限门式起重机)新版试题考前必练&#xff01;安全生产模拟考试一点通每个月更新起重机司机(限门式起重机)找解析题目及答案&#xff01;多做几遍&#xff0c;其实通过起重机司机(限门式起重机)作业模拟考试…

另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国

前不久&#xff0c;灰度在与 SEC 就关于 ETF 受理的诉讼案件中&#xff0c;以灰度胜诉告终。灰度的胜利&#xff0c;也被加密行业看做是加密 ETF 在北美地区阶段性的胜利&#xff0c; 该事件也带动了加密市场的新一轮复苏。 此前&#xff0c;Nason Smart Money 曾对加密市场在 …

大语言模型(LLM)综述(七):大语言模型设计应用与未来方向

A Survey of Large Language Models 前言8 A PRACTICAL GUIDEBOOK OF PROMPT DESIGN8.1 提示创建8.2 结果与分析 9 APPLICATIONS10 CONCLUSION AND FUTURE DIRECTIONS 前言 随着人工智能和机器学习领域的迅速发展&#xff0c;语言模型已经从简单的词袋模型&#xff08;Bag-of-…

攻防世界题目练习——Web引导模式(四)(持续更新)

题目目录 1. shrine2. very_easy_sql3. fakebook 1. shrine 打开网页题目内容如下&#xff1a; 是一段代码&#xff0c;我们把它还原一下&#xff1a; import flask import osapp flask.Flask(__name__) app.config[FLAG] os.environ.pop(FLAG) #这里应该是将config配置里…

Linux/centos上如何配置管理Web服务器?

Linux/centos上如何配置管理Web服务器&#xff1f; 1 Web简单了解2 关于Apache3 如何安装Apache服务器&#xff1f;3.1 Apache服务安装3.2 httpd服务的基本操作 4 如何配置Apache服务器&#xff1f;4.1 关于httpd.conf配置4.2 常用指令 5 简单实例 1 Web简单了解 Web服务器称为…