golang 专栏
文章平均质量分 54
基于网络协议栈驱动开发记录
老理说的好
技术也修行!
展开
-
Go json串嵌套结构序列化实例和解析
在采用 gin 框架写后端api时,经常会有嵌套形式的json串,如何使用golang进行序列化呢,此文实例详细说明。返回vue前端的嵌套的json串实例json串结构如下:{"data": { "userInfo": { "id":1, "username":"admin", "type":"0", "status":"0", "add_system_time":"1591434825", "last_login_time":1原创 2021-08-25 18:54:38 · 2222 阅读 · 0 评论 -
Go 语言封装C语言源文件的方法详解和实例 / Go cgo使用方法
本文实践 go 语言引用 c 源文件,通过 go 语言封装的实例,在嵌入式开发过程中,此方法可以解决很多实际问题。自定义包的步骤第一步编写包的程序,本文以go 调用 c 语言为例,在 GOROOT/src 下建立 util包 文件夹,内容如下:robot@ubuntu:/usr/local/go/src/util$ lsgo.mod util.c util.go util.hrobot@ubuntu:/usr/local/go/src/util$ cat util.h int cSu原创 2021-08-19 15:26:39 · 723 阅读 · 0 评论 -
Golang 之os包之 process 接口函数汇总
此篇记录 线程相关的接口函数,此部分例程待补充。1.Process结构体功能:Process存储了通过StartProcess创建的进程信息。type Process struct { Pid int //当前进程id handle uintptr //处理指针 isdone uint32 //如果进程正在等待则该值非0,没有等待该值为0 sigMu sync.RWMutex //原创 2021-08-19 10:39:20 · 2086 阅读 · 0 评论 -
Golang 之os 包功能分析及实例
接口函数列表func Hostnamefunc Hostname() (name string, err error)Hostname返回内核提供的主机名。func Getpagesize func Getpagesize() intGetpagesize返回底层的系统内存页的尺寸。func Environfunc Environ() []stringEnviron返回表示环境变量的格式为"key=value"的字符串的切片拷贝。func Getenvfunc Getenv(k原创 2021-08-18 17:57:15 · 242 阅读 · 0 评论 -
Go语言执行系统命令包 os/exec 用例详解
os/exec包提供了执行外部命令的方法,它包装了os.StartProcess函数以便更容易的修正输入和输出,使用管道连接I/O。Cmd structtype Cmd struct { // Path是将要执行的命令的路径。 // // 该字段不能为空,如为相对路径会相对于Dir字段。 Path string // Args保管命令的参数,包括命令名作为第一个参数;如果为空切片或者nil,相当于无参数命令。 // // 典型用法下,Path和Ar原创 2021-08-17 19:15:57 · 1454 阅读 · 0 评论 -
vscode、golang开发环境、win10本地调试、ubuntu本地调试
本篇记录 golang在win10的vscode环境中,开发调试环境搭建过程记录,谨防忘记。Win10 环境搭建记录环境64位的win10 操作系统。1.安装软件安装软件顺序和内容如下:Git:https://gitforwindows.org/Go:https://golang.google.cn/dl/vsocde:https://code.visualstudio.com/全部采用确认路径安装,无特殊说明。PS C:\Users\ljb> git versiongit v原创 2021-08-15 21:54:17 · 426 阅读 · 0 评论 -
golang 的 path/filepath 包接口函数实例分析
接口函数汇总ToSlash函数func ToSlash(path string) string功能:将path中平台相关的路径分隔符转换成’/’FromSlash函数func FromSlash(path string) string功能:将 path 中的 ‘/’ 转换为系统相关的路径分隔符3.Dir函数func Dir(path string) string功能:获取path中最后一个分隔符之前的部分(不包含分隔符)4.Base函数func Base(path str原创 2021-08-12 19:23:48 · 690 阅读 · 0 评论 -
golang file 应用实例详解
file 操作接口函数1.Create函数功能:创建一个文件,文件的mode为0666(读写权限),如果文件已存在,则重新创建一个,原文件被覆盖(内容会被清空),创建的新文件具有读写权限,实现是调用OpenFile来创建文件的。func Create(name string) (*File, error) { return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)}2.NewFile函数功能:根据文件描述符和名字创建一原创 2021-08-12 18:13:56 · 1162 阅读 · 0 评论 -
go语言 json 序列化、反序列化用例解析
简介Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端数据传输。任意一端将数据转换成json 字符串,另一端再将该字符串解析成相应的数据结构,如string类型,strcut对象等。go语言本身为我们提供了json的工具包”encoding/json”。- Encodingfunc Marshal(v interface{}) ([]byte, error)递归进行json编码func MarshalIndent(v interface{},原创 2021-08-12 16:19:03 · 529 阅读 · 0 评论 -
golang基础--时间戳、日期的应用实例
简介时间可分为时间点与时间段,golang 也不例外,提供了以下两种基础类型时间点(Time)时间段(Duration)常用方法获取和时间处理方法 // func Now() Time fmt.Println(time.Now()) // func Parse(layout, value string) (Time, error) time.Parse("2016-01-02 15:04:05", "2018-04-23 12:24:51") // func原创 2021-08-12 13:04:56 · 652 阅读 · 0 评论 -
Go语言 bytes.Buffer 用法实例详解
bytes.Buffer 简介bytes.Buffer 是 Golang 标准库中的缓冲区,具有读写方法和可变大小的字节存储功能。缓冲区的零值是一个待使用的空缓冲区。常用方法声明var b bytes.Buffer //直接定义一个Buffer变量,不用初始化,可以直接使用b := new(bytes.Buffer) //使用New返回Buffer变量b := bytes.NewBuffer(s []byte) //从一个[]byte切片,构造一个Bu原创 2021-08-11 18:57:07 · 1774 阅读 · 0 评论 -
Go 语言 rune 类型的详解实例
rune & byte 类型rune是int32的别名类型,一个值就代表一个Unicode字符。byte是uint8的别名类型,一个值就是一个ASCII码值。rune类型的值在底层都是由一个 UTF-8 编码值来表达的。Unicode字符,我们平时接触到的中英日文,或者复合字符,都是Unicode字符。UTF-8 编码方案会把一个 Unicode 字符编码为一个长度在 1~4 以内的字节序列。所以,一个rune类型值代表了1~4个长度的byte数组。实例说明package main原创 2021-08-11 18:00:09 · 1117 阅读 · 0 评论 -
Go list 应用解析与实例
list 概述list 是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此直接的关系。Go 语言中list的实现原理是双向链表,list能高兴地进行任意位置元素的插入和删除操作。Golang的 list 内置库Golang 的标准库提供高级的数据结构List,具体位置在 container/list/list.go 文件中。container/list 包里注意有两个数据结构类型: ‘Element’ & ‘List’;Element 类型代表双向链表, 相当于 C+原创 2021-08-11 17:12:23 · 820 阅读 · 0 评论 -
golang map 应用实例与解析
map 简介map 是 go 中的内置类型,它将一个值与一个键关联起来,可以使用相应的建检索值。使用注意事项map 是无序的,它不是通过index获取,而必须通过 key 获取map 长度不固定,内置len() 函数适用,cap()函数不适用同一个 map中key 必须保证唯一map 的 vlaue 值可以是任意类型map 是引用类型golang中的map声明非常简单,我们用map关键字表示声明一个map,然后在方括号内填上key的类型,方括号外填上value的类型。var m map原创 2021-08-11 14:33:01 · 2785 阅读 · 0 评论 -
go 语言 timer 与 ticker 应用实例与解析
Go里提供了两种定时器:Timer(到达指定时间触发且只触发一次)和 Ticker(间隔特定时间触发)。Timer和Ticker的实现几乎一样,Ticker相对复杂一些,这里讲述一下Ticker是如何实现的。让我们先来看一下如何使用Tickerpackage mainimport( "fmt" "time")func main(){ d := time.Duration(time.Second*1) t := time.NewTicker(d) defer t.Stop() f原创 2021-08-10 12:41:17 · 551 阅读 · 0 评论 -
go string 应用方法汇总与实例
go语言的string提供的方法,涉及源码文件src/string/*compare.go reader.go replace.go search.go strings.go请读者自行查看源码相关内容实例内容如下package mainimport ( "fmt" "strings" "strconv")func main(){ var str string = "http://www.hello-hello.com " cc := strings.HasPrefix(s原创 2021-08-09 11:57:09 · 203 阅读 · 0 评论 -
go reflect、go语言的反射应用实例与分析
反射 reflection 特性描述反射可大大提供程序的灵活性、使得interface{}有更大的发挥余地反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息发射会将匿名字段作为独立字段 (匿名字段本质)利用反射修改对象状态、前提是 interface.data 是 settable,即 pointer-interface通过发射可以 “动态”调用方法reflect 包涉及到源码文件$GOPATH/src/reflect/value.go && typ原创 2021-08-09 11:18:25 · 282 阅读 · 0 评论 -
go 语言RPC调用,JSON和HTTP方式调用详解及实例
RPC定义RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议。简单的说就是要像调用本地函数一样调用服务器的函数。RPC协议构建于TCP或UDP,或者是 HTTP之上,允许开发者直接调用另一台计算机上的程序,而开发者无需额外地为这个调用过程编写网络通信相关代码,使得开发包括网络分布式程序在内的应用程序更加容易。http版本的RPC版语言的RPC包的路径为net/rpc,也就是放在了net包目录下面,原创 2021-08-06 14:21:19 · 733 阅读 · 1 评论 -
go语言 解析yaml文件详解
yaml格式文件作为配置文件、包管理文件,众多软件都在使用,go 语言通过 “gopkg.in/yaml.v2” 包,可以支持 yaml文件解析和处理。文件conf.yaml 文件内容如下:robot@ubuntu:~/gomod/src/yaml$ cat conf.yaml config: user: - Tom - Lily - Skay mqtt: host: localhost:1883 username: test pass原创 2021-08-05 12:55:42 · 6046 阅读 · 0 评论 -
Go语言 sync.Pool 应用详解
sync.Pool 除了最常见的池化提升性能的思路,最重要的是减少 GC 。常用于一些对象实例创建昂贵的场景。注意,Pool 是 Goroutine 并发安全的。一、sync.Pool 适应场景sync.Pool 本质用途是增加临时对象的重用率,减少 GC 负担;sync.Pool 中保存的元素有如下特征:Pool 池里的元素随时可能释放掉,释放策略完全由 runtime 内部管理;Get 获取到的元素对象可能是刚创建的,也可能是之前创建好 cache 的,使用者无法区分;Pool 池里面的原创 2021-08-05 11:10:31 · 2931 阅读 · 0 评论 -
dubbo-go 的开发、设计与功能介绍
dubbo-go 的前世今生dubbo-go 是目前 Dubbo 多语言生态最火热的项目。dubbo-go 最早的版本应该要追溯到 2016 年,由社区于雨同学编写 dubbo-go 的初版。当时很多东西没有现成的轮子,如 Go 语言没有像 netty 一样的基于事件的网络处理引擎、 hessian2 协议没有 Go 语言版本实现,加上当时 Dubbo 也没有开始重新维护。所以从协议库到网络引擎,再到上层 dubbo-go ,其实都是从零开始写的。在 2018 年,携程开始做 Go 语言的一些中间件以转载 2021-08-04 16:49:24 · 900 阅读 · 0 评论 -
go 连接 kafka 集群、消息发送、接收实例分享
本文分享 go 语言连接 kafka 源码,kafka 系统原理及搭建等信息,请自行查阅相关资料。kafka 消息发送实例1 ,发送 stringpackage mainimport ( "os" "time" "fmt" "log" "github.com/Shopify/sarama"// "github.com/bsm/sarama-cluster")var Address = []string{"172.20.91.15:9092"}var HaAddress = []原创 2021-08-04 15:53:30 · 2459 阅读 · 0 评论 -
Golang sync.Cond 应用详解
sync.Cond 简介Cond 实现了一个条件变量,在 Locker 的基础上增加的一个消息通知的功能,保存了一个通知列表,用来唤醒一个或所有因等待条件变量而阻塞的 Go 程,以此来实现多个 Go 程间的同步。go原生支持的功能,可以到 go/src 源码中,根据关键字搜索相关内容。type Cond struct { // L is held while observing or changing the condition L Locker // contains filtered原创 2021-08-04 12:17:57 · 376 阅读 · 0 评论 -
Go语言sync.WaitGroup应用详解
基础简介sync.WaitGroup也是一个经常会用到的同步方法,它的使用场景是在一个goroutine等待一组goroutine执行完成。sync.WaitGroup拥有一个内部计数器。当计数器等于0时,则Wait()方法会立即返回。否则它将阻塞执行Wait()方法的goroutine直到计数器等于0时为止。要增加计数器,我们必须使用Add(int)方法。要减少它,我们可以使用Done()(将计数器减1),也可以传递负数给Add方法把计数器减少指定大小,Done()方法底层就是通过Add(-1)原创 2021-08-03 15:46:48 · 1600 阅读 · 0 评论 -
深入理解 Golang Goroutine 并发编程
Go协程(Goroutine)是与其他函数或方法同时运行的函数或方法。可以认为Go协程是轻量级的线程。与创建线程相比,创建Go协程的成本很小。因此在Go中同时运行上千个协程是很常见的。Go协程对比线程的优点与线程相比,Go协程的开销非常小。Go协程的堆栈大小只有几kb,它可以根据应用程序的需要而增长和缩小,而线程必须指定堆栈的大小,并且堆栈的大小是固定的。Go协程被多路复用到较少的OS线程。在一个程序中数千个Go协程可能只运行在一个线程中。如果该线程中的任何一个Go协程阻塞(比如等待用户输入),那原创 2021-08-03 14:09:23 · 140 阅读 · 0 评论 -
深入理解 Golang Channel 并发编程
一、基础简介Golang使用Groutine和channels实现了CSP(Communicating Sequential Processes)模型,channles在goroutine的通信和同步中承担着重要的角色。这种方式的优点是通过提供原子的通信原语,避免了竞态情形(race condition)下复杂的锁机制。channel 可以看成一个 FIFO 队列,对 FIFO 队列的读写都是原子的操作,不需要加锁。Golang 语言中Channel类型的定义格式如下:chan Tr原创 2021-08-03 12:49:26 · 558 阅读 · 0 评论 -
go 语言数组与 go语言切片实例分析
一维数组、二维数组定义和初始方法package mainimport "fmt"func main() { var a [5]int = [5]int{1,2,3,4,5} fmt.Println("a init mothed:", a) b := [5]int{5,4,3,2,1} fmt.Println("b init mothed:", b) c := [5]int{1,2,3} fmt.Pri原创 2021-08-02 23:17:54 · 121 阅读 · 0 评论 -
go 语言多态、继承的实现方法、go interface 接口
在Go语言的实际编程中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心。(1)、 泛型编程严格来说,在 Golang 中并不支持泛型编程。使用 interface 我们可以实现泛型编程,如下是一个参考示例:字符串排序package mainimport ( "fmt" "sort")// 将[]string定义为MyStringList类型type MyStringList []string// 实现sort.Interface接口的获取元素数量方原创 2021-08-02 15:49:58 · 507 阅读 · 0 评论 -
go 语言面向对象编程、go语言类、方法、多态实例
本篇主要分享go语言的面向对象编程小实例,加深对go语言面向对象编程部分内容认识。类在 Go 语言中没有类(Class)的概念,Go 语言中可以使用结构体(Structs)对属性进行封装,结构体就像是类的一种简化形式。方法Go 语言中方法(Methods):Go 方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数。继承在 Go 语言中没有 extends 关键字,它使用在结构体中内嵌匿名类型的方法来实现继承。(1)、类和方法原创 2021-08-01 13:57:18 · 382 阅读 · 0 评论 -
34 --> OpenWRT 嵌入式mips环境的go 环境搭建、gin验证测试代码分享
笔者早期在嵌入式上、 http server的程序,实现静态网页相关功能,采用的第三方 goahead 组件,纯C语言实现,编写应用还是比较麻烦的。go语音被称作互联网时代的"C" 。简单和高效率,跨平台功能也非常强大,本次项目中再次需要搞嵌入式的WEB服务,并且还需要提供接口API功能,把设备功能向第三方开放,就采用go 语言来承担此次研发语言。在工作之余分享一下go语言相关的体会,首先我们需要一个嵌入式开放环境,本篇就作为 go 专栏的开篇文章吧。第一步 安装 go1.4 编译环境c原创 2021-07-24 14:27:59 · 2053 阅读 · 0 评论 -
go 语言连接远程redis详解与实践
一、cenOS 7 安装 redisRedis是一个开源的内存数据结构存储库,具有用于持久性的可选磁盘写入。它可以用作键值数据库,也可以用作缓存和消息代理。Redis具有内置事务,复制和对各种数据结构(如字符串,哈希,列表,集等)的支持。Redis可以通过Redis Sentinel高度可用,并支持使用Redis Cluster自动分区。在本节中,您将添加EPEL存储库,然后使用它来安装Redis。1.1 添加EPEL存储库,并更新YUM以确认您的更改:sudo yum install ep原创 2021-07-28 15:19:01 · 842 阅读 · 0 评论 -
go语言的包管理工具(golang module)详解与实践
一、golang 的 module 是包管理工具此篇属于golang开发基础、入门,管理源码中包的依赖关系、版本。捋顺包管理方法、重要性不言而喻。在 go1.11 之前,安装 golang 之后,需要配置两个环境变量即GOROOT 和GOPATH。GOROOT是 go 安装后的所在的路径,GOPATH是开发工作目录路径,用于存放go 源代码的地方。在 GOPATH 路径内,有三个文件夹,分别是:bin: go 编译后的可执行文件所在的文件夹pkg: 编译非 main 包的中间连接文件src:原创 2021-07-28 15:17:16 · 2282 阅读 · 0 评论 -
35 --> OpenWRT 嵌入式 go1.15.14版本、测试 gin 框架和源码分享
此篇文章是对 《34 --> OpenWRT 嵌入式mips环境的go 环境搭建、gin验证测试代码分享》文章的补充,因为测试的时候,发现一个关于 protobuf 库依赖错误问题,go wiki 上说 go1.11 版本就存在此问题,所以此篇属于填补上一篇承诺分享 gin框架和源码诺言的实现。第一步 下载 go1.15.141.1 编译go交叉编译环境curl -# -O https://dl.google.com/go/go1.15.14.src.tar.gztar -zxvf go1.11原创 2021-07-24 16:37:19 · 860 阅读 · 3 评论