当前位置: 首页 > news >正文

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()}

在这里插入图片描述

相关文章:

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

目录标题 一、Json序列化与反序列化1. 序列化2. 反序列化 二、Goto语法三、Tcp Socket1. 单客户端发送信息到服务端2. 服务端客户端通信 一、Json序列化与反序列化 1. 序列化 package mainimport ("encoding/json""fmt")type Person struct {Name string…...

gitlab-ce-12.3.5 挖矿病毒及解决方案

前言 最近发现在使用gitlab提交代码的时候总是失败&#xff0c;一访问gitlab还时常报503&#xff0c;于是使用 top 命令查看了内存占用情况&#xff0c;发现了一个git进程内存使用了2.3g&#xff0c;cpu还一直占用300-400%&#xff0c; 以前不知道gitlab还有病毒&#xff0c;只…...

每日一题(LeetCode)----数组--移除元素(四)

每日一题(LeetCode)----数组–移除元素&#xff08;四&#xff09; 1.题目&#xff08;[844. 比较含退格的字符串](https://leetcode.cn/problems/sqrtx/)&#xff09; 给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&…...

421. 数组中两个数的最大异或值/字典树【leetcode】

421. 数组中两个数的最大异或值 给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 示例 1&#xff1a; 输入&#xff1a;nums [3,10,5,25,2,8] 输出&#xff1a;28 解释&#xff1a;最大运算结果是 5 XOR…...

C++(20):自定义类型实现基于范围的for循环

C自定义类型&#xff0c;可以通过实现begin和end作为成员函数&#xff0c;来支持基于范围的for循环 #include <iostream>class D{ public:int* begin(){return m_data;}int* end(){return m_data 5;} private:int m_data[5]{1, 2, 3, 4, 5}; };int main() {D d;for (in…...

Linux常用命令:find、grep、vim、cat、less、more

目录 我的常用搜索命令 find 命令 grep 命令 vim 常用命令&#xff1a; 1.光标移动命令 2插入命令 3.删除命令 4.复制和粘贴命令 5.撤销和重做命令 6.查找和替换命令 7.文件操作命令 8.其他命令 cat命令 less 命令 more 命令 less和more命令的区别 less和vim命…...

Oracle导入,注意事项

在执行导入时&#xff0c;如果导入的触发器引用的表不存在&#xff0c;可能会导致错误。触发器通常会在相关的表结构之后导入&#xff0c;但在导入阶段&#xff0c;表的创建并不一定会立即执行。 在 Oracle 数据库中&#xff0c;触发器的创建可能涉及到对表的引用&#xff0c;…...

【数据结构】入队序列出队序列问题(以21年408真题举例)

题型说明 一般是一个队列&#xff0c;其中一边可以入队&#xff0c;另一边可以入队和出队只可入队的含义是从这个方向是以队列形式存在可以入队和出队表示此边以堆形式存在 怎么分析&#xff1f; 以21年408真题举例 考点分析 出队序列存在两种情况&#xff1a;入之后就出&…...

在ant构建脚本中调用maven的命令

有时候想用maven管理依赖&#xff0c;用ant构建。 在ant的build.xml文件中可以使用exec这个task来调用系统命令&#xff0c;也就可以调用maven的命令。 例如&#xff0c;执行maven的命令mvn dependency:copy-dependencies&#xff0c;可以将项目的依赖提取出来&#xff0c;放…...

美格智能5G RedCap模组顺利完成中国联通5G物联网OPENLAB开放实验室认证

近日&#xff0c;美格智能5G RedCap模组SRM813Q顺利通过中国联通5G物联网OPENLAB开放实验室端到端的测试验收&#xff0c;并获得OPENLAB实验室的认证证书。这标志着该模组产品各项性能均已符合RedCap商用标准&#xff0c;为5G RedCap规模商用奠定了坚实基础。 中国联通5G物联网…...

Git基础知识学习常用命令一

常用命令 $ git status 工作区域与仓库保持一致step2: 暂存状态 $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ git add xx/xx.py xx/xx2.py # 添加某几个文件Step3: commit $ git commit -m"<这里写commit的描述>" 已提…...

【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;收听语音样本…...

云原生 黑马Kubernetes教程(K8S教程)笔记——kubernetes介绍。Master集群控制节点、Node工作负载节点、Pod控制单元

参考文章&#xff1a;kubernetes介绍 文章目录 1. Kubernetes介绍1.1 应用部署方式演变传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上虚拟化部署&#xff1a;可以在一台物理机上运行多个虚拟机&#xff0c;每个虚拟机都是独立的一个环境&#xff…...

[护网杯 2018]easy_tornado 1(两种解法!)

题目环境&#xff1a;发现有三个txt文本文件 /flag.txt/welcome.txt/hints.txt 依此点开 flag在/fllllllllllllag文件中 在hints.txt文件中发现md5计算 md5(cookie_secretmd5(filename)) 并且三个文件中都存在filehash&#xff08;文件名被哈希算法加密32位小写&#xff09; 猜…...

冒泡排序(Bubble Sort)

目录 1.冒泡排序1.1 基本原理1.2 例子1.3 示例代码 2.魔炮排序2.1 基本原理2.1 例子2.2 示例代码 1.冒泡排序 1.1 基本原理 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历待排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的…...

JVM源码剖析之软、弱、虚引用的处理细节

目录 写在前面&#xff1a; 源码剖析&#xff1a; Java层面&#xff1a; JVM层面&#xff1a; 使用危险点&#xff1a; 总结&#xff1a; 版本信息&#xff1a; jdk版本&#xff1a;jdk8u40 垃圾回收器&#xff1a;Serial new/old 写在前面&#xff1a; 不同的垃圾回收…...

Linux服务器上搭建JupyterNotebook教程

搭建需知 1.确保是Linux服务器&#xff1b; 2.已经在linux服务器上安装好anaconda3&#xff1b; 搭建教程 请按照顺序依次执行下面的命令&#xff1a; 1、安装Jupyter Notebook 执行以下命令&#xff0c;安装jupyter notebook conda install jupyter【注】 如果anaconda3…...

记录bug1

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1…...

【MySQL】rank()、row_number()、dense_rank()用法详解

建表测试 测试表数据&#xff1a;test1 CREATE DATABASE /*!32312 IF NOT EXISTS*/db_test /*!40100 DEFAULT CHARACTER SET utf8 */; USE db_test; /*Table structure for table test1 */ DROP TABLE IF EXISTS test1; CREATE TABLE test1 ( id int(10) NOT NULL, score i…...

NFT合约部署

部署合约&#xff1a; 1.web3 NFT合约部署工具 https://remix.ethereum.org/ 2.tron NFT合约部署工具 https://www.tronide.io/ 3.部署 web3 ERC721代码&#xff1a; // SPDX-License-Identifier: MIT pragma solidity ^0.8.2;import "openzeppelin/contracts/token/ERC7…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...