Go语言
文章平均质量分 57
介绍Go语言中基础知识
绛洞花主敏明
研究生在读,喜欢刺激有挑战。
展开
-
binary.write 和 binary.read
此包实现了对数据与byte之间的转换,以及varint的编解码。2、binary为我们开发者提供了哪些内容?二、binary为我们开发者提供了哪些内容?转化成二进制格式与原本数据转字符串相比会更节省空间。golang中encoding/binary包。1、golang包中的binary包是什么?一、golang包中的binary包是什么?uvarint和varint的编解码。3、编解码有哪几种方法?数据的byte序列化转换。原创 2024-03-17 12:17:28 · 535 阅读 · 0 评论 -
go语言---copy()函数
【代码】go语言---copy()函数。转载 2024-03-17 12:01:02 · 19 阅读 · 0 评论 -
go的结构体作为返回值
2、getinfo1() 结构体指针 即使在函数外有实体也会报错崩溃,是因为此时给返回的结构体指针声明了一个结构体指针,但这个结构体指针没有实体,在赋值时会报错。1、getinfo() 结构体指针 需要在返回的结构体在函数外有实体。3、getinfo2() 结构体作为返回值 外层可以有实体也可以没有。原创 2023-12-12 22:29:41 · 631 阅读 · 0 评论 -
golang函数的返回值
函数可以有0或多个返回值,返回值需要指定数据类型,返回值通过return关键字来指定。return可以有参数,也可以没有参数,这些返回值可以有名称,也可以没有名称。go中的函数可以有多个返回值。return关键字中指定了参数时,返回值可以不用名称。如果return省略参数,则返回值部分必须带名称当返回值有名称时,必须使用括号包围,逗号分隔,即使只有一个返回值但即使返回值命名了,return中也可以强制指定其它返回值的名称,也就是说return的优先级更高。原创 2023-12-01 22:41:17 · 758 阅读 · 0 评论 -
Go打印行号和文件名
实参skip为上溯的栈帧数,0表示Caller的调用者(Caller所在的调用栈)。函数的返回值为调用栈标识符、带路径的完整文件名、该调用在文件中的行号。FuncForPC返回一个表示调用栈标识符pc对应的调用栈的*Func;如果该调用栈标识符没有对应的调用栈,函数会返回nil。skip == 1,跳过当前函数栈,返回上层调用者调用当前函数时的PC,文件名,所在行。skip == 0,不跳过函数栈,返回当前函数PC,文件名,所在行。根据返回的调用栈标识符pc,我们可以获取对应的函数名。原创 2023-11-28 22:57:48 · 811 阅读 · 0 评论 -
Go中各种newreader和newbuffer的使用
1、使用的newbuffer,缓存区是用来存储内容的,并不能确定具体需要的内存大小,因此newbuffer的参数为不固定的[]byte{};2、使用的newreader,缓存区应该是有数值的,此时是用来读取其中的内容。原创 2023-11-20 23:33:35 · 553 阅读 · 0 评论 -
Go解析xml文件
【代码】Go解析xml文件。转载 2023-11-17 23:33:59 · 107 阅读 · 0 评论 -
SOAP-Golang对接WebService服务实战
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;转载 2023-11-17 22:28:53 · 357 阅读 · 0 评论 -
Go解析soap数据和修改其中数据
【代码】Go解析soap数据和修改其中数据。原创 2023-11-17 22:23:50 · 595 阅读 · 0 评论 -
go编码处理-json、xml、gob、纯文本
如果XML元素包含一个子元素,其名称匹配格式为"a"或"a>b>c"的标签的前缀,反序列化会深入XML结构中寻找具有指定名称的元素,并将最后端的元素映射到该标签所在的结构体字段。如果XML元素的属性的名字匹配某个标签",attr"为字段的字段名,或者匹配某个标签为"name,attr"的字段的标签名,Unmarshal会将该属性的值写入该字段。 Go语言内建对 JSON 的支持,使用内置的 encoding/json 标准库,开发人员可以轻松使用Go程序生成和解析 JSON 格式的数据。转载 2023-11-17 20:51:28 · 71 阅读 · 0 评论 -
Go语言中一个fallthrough的使用问题
这时候,如果你使用vscode来开发,会提示一个红色的波浪线,这就表明代码是有问题的,我们看这个提示,fallthrough statement out of place,翻译过来就是fallthrough这个声明不合适,那和刚才的示例不一样了啊。相信学习Go语言的小伙伴对fallthrough这个关键词并不陌生,与Java、PHP等语言不同,Go语言的switch case语句不需要在每个case后面添加break语句,默认在执行完case之后,会自动break,从switch语句中转义出来。转载 2023-11-09 22:39:38 · 83 阅读 · 0 评论 -
Go中的接口赋值
接口赋值在go语言中分为如下两种情况1、将对象实例赋值给接口2、将一个接口赋值给另一个接口。转载 2023-10-18 21:39:15 · 111 阅读 · 0 评论 -
go中出现Missing type in composite literal
上面代码在编辑器中会提示这样的错误:Reports composite literals with incompatible types and values。原因在于定义的Person结构体的Favourite字段的类型是字符串切片,但是在main函数中使用时,直接传入了一个结构体对象。两者的类型不相同,所以提示不兼容的类型。对于一些复合数据类型,在使用时应该声明其类型信息,不然Go无法自动判别。因此上面的错误示例只需要改变person初始化时的类型声明即可。转载 2023-10-18 20:49:35 · 142 阅读 · 0 评论 -
go中出现Missing type in composite literal
上面代码在编辑器中会提示这样的错误:Reports composite literals with incompatible types and values。原因在于定义的Person结构体的Favourite字段的类型是字符串切片,但是在main函数中使用时,直接传入了一个结构体对象。两者的类型不相同,所以提示不兼容的类型。对于一些复合数据类型,在使用时应该声明其类型信息,不然Go无法自动判别。因此上面的错误示例只需要改变person初始化时的类型声明即可。转载 2023-10-18 20:44:52 · 94 阅读 · 0 评论 -
Golang 定时器与 time.After()
并且我们是在 for 循环中定时执行 select,也就相当于每一次执行 select 我们都重新创建(实例化)了新的 time.After()。从输入内容可以看出,程序根本没有打印 exit,也证明了 goroutine 不是由 time.After() 退出,而是由于主协程(main) sleep 结束之后退出。After() 函数接受一个时长 d,然后 After() 等待 d 时长,等待时间到后,将等待完成时所处时间点写入到 channel 中并返回这个只读 channel。转载 2023-10-18 20:37:50 · 190 阅读 · 0 评论 -
Go语言---函数返回局部变量地址
go语言声称这样可以释放程序员关于内存的使用限制,更多的让程序员关注于程序功能逻辑本身。(2) 函数返回局部变量地址:局部变量内存分配在栈空间,因为函数返回后,系统自动回收了函数里定义的局部变量,所以运行时去访问一个被系统回收后的地址空间,一定就会发生段错误,这是C/C++语言的特点。(1) 在C语言中,一个函数可以直接返回函数中定义的局部变量,其实在函数返回后,局部变量是被系统自动回收的,因为局部变量是分配在栈空间,那为什么还可以返回局部变量,其实这里返回的是局部变量的副本(拷贝)。转载 2023-10-14 11:12:52 · 82 阅读 · 0 评论 -
goland和main包的同级目录的函数
要求: 在One文件下有两个文件,分别为main.go和add.go,main.go调用add.go中的Add()函数并输出。转载 2023-10-14 11:11:11 · 70 阅读 · 0 评论 -
Golang中new 和make 关键字的区别
make 也是用于内存分配的,但是和 new 不同,它只用于 slice、map 和 chan 的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型。上面的代码是等价的,new(int) 将分配的空间初始化为 int 的零值,也就是 0,并返回 int 的指针,这和直接声明指针并初始化的效果是相同的。这就是 new 函数,它返回的永远是类型的指针,指针指向分配类型的内存地址。从上面的代码可以看出,new 函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针。转载 2023-10-14 11:05:25 · 37 阅读 · 0 评论 -
go中之间的类型转换
unsafe强制转换是指针的底层操作了,用c的朋友就很熟悉这样的指针类型转换,利用内存对齐才能保证转换可靠,例如int和uint存在符号位差别,利用unsafe转换后值可能不同,但是在内存存储二进制一模一样。float64就强制转换成uint64类型,float的地址就是一个值但是类型是float64,然后创建了一个uint64类型变量,地址值也是float64的地址值,两个变量值相同类型不同,强制转换了类型。这个函数的最后一个参数是需要有固定大小的参数,才能写入,因此 如果没有初始化的话,会之间报错。原创 2023-09-16 22:45:14 · 211 阅读 · 0 评论 -
Go编程技巧--io.Reader/Writer
Reader 接口仅有一个 Read 方法,所以只要实现了Read(p []byte) (n int, errerror)方法的类型,我们就认为其类型就是 Reader。Read 方法会把读取的数据复制到 p 中 ,一次只能读取最高不超过len(p)的数据,并不保证一定会读满整个 p,读取的数据量返回到n,并在读完的时候返回 io.EOF 到 err。Read 方法可以从不同来源读取数据,这个来源可能是文件、网络传输的数据或者普通的字符串,io.Reader。转载 2023-09-10 16:43:29 · 428 阅读 · 0 评论 -
byte类型的切片([]byte)与string
Go 语言中,表示字符串的数据类型是 string。我们知道字符串是由字节组成,而字节序列在 Go 语言中是用 byte 类型的切片([]byte)表达,因此 string 类型和 []byte 是可以互相转化的。byte 类型是 unit8 类型的别名,因此输出的 bslice 变量的类型是 “[]unit8”,而后面值对应 ASCII 编码。我们再把 byte 类型的切片 转成 字符串试试?转载 2023-09-10 12:15:32 · 134 阅读 · 0 评论 -
将切片作为参数传入函数并使用append方法遇到的问题
因为Data是一个指向数组的指针,所以对该指针进行值拷贝时,得到的指针仍指向相同的数组,所以通过拷贝的指针对底层数组进行修改时,原切片的值也会发生相应变化。但是,我们以值传递的方式传递切片结构体的时候,同时也是传递了Len和Cap的值拷贝,因为这两个成员并不是指针,因此,当函数返回时,原切片结构体的Len和Cap并没有改变。在函数中使用append方法,切片的底层数组进行了扩容处理,因此在拷贝切片中,指针指向了新的数组,而原切片并没有指向新的数组,因此原切片不会添加新的值。方法在函数中对切片进行添加操作。转载 2023-09-10 00:59:07 · 74 阅读 · 0 评论 -
go work 不同包下mod + work实现.go文件的互相调用
需要注意的是,在go.work中添加了子模块的路径,否则在main.go 中会报错如下。原创 2023-09-07 23:50:24 · 790 阅读 · 0 评论 -
Go语言的跨文件调包
├── main└── util文件在调用其它包的时候,需要在代码中引用其他的函数,包的命名一般都以小写为主,文件中函数的以首字符为大写的函数为共有函数,小写的为私有函数,只能是在同一个包中来回调用,公有函数可直接被其他包调用。原创 2023-09-07 23:34:54 · 540 阅读 · 0 评论 -
Golang交叉编译中的那些坑
一、Golang交叉编译查看Golang支持的平台和版本go tool dist list这种方式可以查看支持的平台,但是不能看出是否支持cgo,因此此时需要使用json的方式对是否支持cgo的方式进行查看是否支持cgo。使用命令:"go tool dist list -json" 以json格式列出其实go的交叉编译非常简单,只需要在编译前指定系统和CPU架构,基本不会有任何问题,编译出来讲文件拷贝到对应平台就能跑:GOOS=linux GOARCH=arm64 go build xxx.转载 2022-03-22 22:56:22 · 2259 阅读 · 0 评论 -
Go语言到C语言的结构体指针和整型指针
1、Go -> C结构体package main/*#include <stdlib.h>#include <stdio.h>struct MyString{ char* s; int len;};struct MyString xmalloc(int len){ static const char* s = "0123456789"; char* p = malloc(len); if (len <= strlen(s)) { mem原创 2021-12-13 21:08:46 · 1885 阅读 · 0 评论 -
在Go中使用C函数,并调用指针
直接上代码:package main/*#include <stdio.h>#include <stdlib.h>void c_print(char *str) { printf("%s\n", str); sprintf(str, "data:%s", "ddd");}*/import "C" //import “C” 必须单起一行,并且紧跟在注释行之后import ( "fmt" "unsafe")func main() { va原创 2021-12-13 20:14:34 · 735 阅读 · 0 评论 -
Go实现链表队列
该文的作者的链接为https://blog.csdn.net/weixin_43456598/article/details/100538598用链表实现队列的思路如上图,这样插入和取出操作时间复杂度都是O(1)// 链表实现队列的方法定义type node struct { Item interface{} Next *node}type linkedListQueue struct { Length int head *node //头节点 tail *node //尾节原创 2021-11-28 15:16:59 · 175 阅读 · 0 评论 -
Go语言中匿名嵌套结构体的初始化
匿名嵌套结构体的两个初始化方式:方式一结构体内嵌初始化时,将结构体内嵌的类型作为字段名像普通结构体一样进行初始化,详细实现过程请参考下面的代码package mainimport "fmt"// 车轮type Wheel struct { Size int}// 引擎type Engine struct { Power int // 功率 Type string // 类型}// 车type Car struct { Wheel转载 2021-11-26 23:43:09 · 890 阅读 · 0 评论 -
Go语言中通过Interface{}接口传入结构体如何取到数值
使用interface接口进行处理时,由于需要对传入的参数进行断言,这就涉及到反射(reflect)的使用。废话不多说,直接上代码由于使用的是go test对例子进行测试,因此可以分为以下几个步骤1、创建client_test.go文件type ss struct { index int value string}func TestFun(t *testing.T) { var sss = ss{index: 1, value: "data"} dd(sss)}func dd原创 2021-11-25 23:27:29 · 3219 阅读 · 0 评论 -
GO 依赖管理工具go Modules
以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样,随着go modules 在go1.11版推出,go1.12版功能不断改进,再到go1.13版完善优化,正式扶正。预计dep将来也只能定格在“official experiment”了。Go Modules有哪些特点:Go Modules是官方正式推出的包依赖管理项目,由Russ Cox (即Go 现转载 2021-03-08 19:07:19 · 439 阅读 · 0 评论 -
Go tcp socket
1、socket 入门socket,中文是套接字的意思。套接字又是干什么的?是负责进程间通信的。进程间通信有很多种,socket在进程间通信中起到了什么样的作用呢?起到了跨越千山万水和某一台主机的进程通信,也就是网络中两个节点进行通信。那A机器的进程怎么和B机器的进程进行通信?套接字是这么设计的:找到B机器的ip和端口就行。很简洁明了,对方的ip锁定了,就是锁定对方主机;如果端口号再锁定,进程也锁定。所以,套接字能进程间通信也就顺理成章了。实现既然套接字=ip+port,那么怎么实现一个套接字呢?这里转载 2021-11-06 17:40:27 · 362 阅读 · 0 评论 -
Go中的可变参数--变参函数
1、可变参数类型例子:func Printf(format string, args ...interface{}) { // ...}用 interface{} 传递任意类型数据是Go语言的惯例用法,使用 interface{} 仍然是类型安全的,这和 C/C++ 不太一样,下面通过示例来了解一下如何分配传入 interface{} 类型的数据。package mainimport "fmt"func MyPrintf(args ...interface{}) { for原创 2021-11-04 23:52:00 · 465 阅读 · 0 评论 -
Go语言几大命令简单介绍
假如你已安装了Go语言,你可以在命令行执行go命令查看相关的Go语言命令。如图:go buildgo build 命令主要是用于测试编译。在包的编译过程中,若有必要,会同时编译与之相关联的包。如果是普通包,当你执行go build命令后,不会产生任何文件。如果是main包,当只执行gobuild命令后,会在当前目录下生成一个可执行文件。如果需要在$GOPATH/bin木下生成相应的exe文件,需要执行goinstall 或者使用 go build -o 路径/a.exe。如果某个文件夹下有转载 2021-11-03 23:05:46 · 198 阅读 · 0 评论 -
Go go.mod详解
什么是go.mod?Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。Go.mod其实就是一个Modules,关于Modules的官方定义为:Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性。Modules替换旧的基于GOPATH的方法,来指定使用哪些源文件。Modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个转载 2021-11-03 22:54:24 · 17917 阅读 · 6 评论 -
Go语言单元测试
单元测试——测试和验证代码的框架要开始一个单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾。默认的情况下,go test命令不需要任何的参数,它会自动把你源码包下面所有 test 文件测试完毕,当然你也可以带上参数。这里介绍几个常用的参数:-bench regexp 执行相应的 benchmarks,例如 -bench=.;-cover 开启测试覆盖率;-run regexp 只运行 regexp 匹配的函数,例如 -run=Array 那么就执行包含有 Arr转载 2021-10-31 20:02:09 · 224 阅读 · 0 评论 -
Go中包、Init函数与执行顺序
一、包的概念Go语言的包借助了目录树的组织形式,一般包的名称就是其源文件所在目录的名称。这就像在一个已经存在的包中生成一个子目录一样,在编写代码时,导入包需要做的仅仅只是提供这个要被嵌套的包的相对路径。Go语言都是以包为组织的,类似于其他语言中的库和模块。代码中的层次结构,圈出的即为包名,其下可放多个源文件(注:此处IDE为VSCODE)用 import 语法后跟包名来导入包,会优先搜寻GOROOT/src 目录中寻找包目录,如果没有找到,则会去 GOPATH/src目录中继续寻找。p转载 2021-10-31 19:18:08 · 1534 阅读 · 0 评论 -
Go结构体初始化的几种方式
new初始化结构体指针可以通过使用new关键字对结构体进行实例化,得到的是结构体的地址。 格式如下:package mainimport "fmt"type stu struct { name,address string}func main() { // 结构体指针1 var stu1 = new(stu) stu1.name = "张三" (*stu1).address = "北京" fmt.Println(stu1)}stu1.name = "张三"其实在底层是(*转载 2021-10-31 18:56:58 · 1443 阅读 · 0 评论 -
由浅入深剖析 go channel
channel 介绍channel 提供了一种通信机制,通过它,一个 goroutine 可以想另一 goroutine 发送消息。channel 本身还需关联了一个类型,也就是 channel 可以发送数据的类型。例如: 发送 int 类型消息的 channel 写作 chan int 。channel 创建channel 使用内置的 make 函数创建,下面声明了一个 chan int 类型的 channel:ch := make(chan int)c和 map 类似,make 创建了一个底转载 2021-07-10 23:23:13 · 189 阅读 · 0 评论 -
go语言中如何分别通过接口和结构体来分别调用函数
在当前工程中新建proto的文件夹,将其以此作为新的模块,在文件夹中新建testmodule.go文件,其中存放的是测试用模块的接口和结构体。存放的内容如下:package testimport "fmt"package testtype Iprotos interface{ Sest()}type Data struct{ i int}func (a *Data) Sest() { fmt.Println("sest")}注意:其中打印函数中结构体也可以不加*号,也原创 2021-07-10 19:58:30 · 256 阅读 · 0 评论