Go-Code
文章平均质量分 66
y果子
愿你成为自己的太阳,无需借助谁的光
展开
-
channel 实现并发读写
文章目录1. 实现一个线程安全的map2. 并发读写3. 多写多读4. 生产者消费者1. 实现一个线程安全的maptype RWMap struct { Lock sync.RWMutex DMap map[string]string}func (r *RWMap)Get(key string)string{ r.Lock.RLock() defer r.Lock.RUnlock() if v,ok := r.DMap[key]; ok { return v } return原创 2021-12-30 16:49:15 · 1189 阅读 · 0 评论 -
Kubernetes--Code
1、简述etcd及其特点etcd是CoreOS团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于Go语言实现。特点:简单:支持REST风格的HTTP+JSON API安全:支持HTTPS方式的访问快速:支持并发1k/s的写操作可靠:支持分布式结构,基于Raft的一致性算法,Raft是一套通过选举主节点来实现分布式系统一致性的算法。2、简述etcd适应的场景etcd基于其优秀的原创 2021-12-15 10:13:08 · 276 阅读 · 0 评论 -
中文字符串的编码转换 UTF-8//GBK
golang在处理中文时默认的是utf-8编码,当某些情况下遇到GBK编码或需要GBK编码时,就会出现显示乱码的问题。1. simplifiedchinesegolang官方有针对中文编码转换的包:golang.org/x/text/encoding/simplifiedchineseimport "golang.org/x/text/encoding/simplifiedchinese"func ConvertStr2GBK(str string) string { //将utf-8编码原创 2020-11-24 20:58:18 · 2932 阅读 · 0 评论 -
cobra
cobra–>cmd–>root.gopackage cmdimport ( "fmt" "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" "github.com/spf13/viper" "os" "strings")var cfgFile stringvar echoTimes intvar RootCmd = &cobra.Command{ Use: "app",}var cm原创 2020-11-24 10:53:08 · 277 阅读 · 0 评论 -
html/template
库(html/template):是go实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。简单说就是对html,css,javascript进行安全转换;例如对html中的<div>这个标签的特殊字符<>进行转换。还有用于生成安全的html模版代码的方法。与之相似还有另一个包 text/template,只是前者解析html,后者解析普通文本字符串而已。常见的几个html转义字符:package mainimport ( "fmt" "html" "原创 2020-11-13 18:26:54 · 981 阅读 · 0 评论 -
crypto/md5
先认识go的hash接口(位于go标准库-hash包):type Hash interface { // 通过io.Writer接口的Write方法向hash中添加数据 io.Writer // 返回添加b到当前的hash值后的新切片,不会改变底层的hash状态,这个方法就是返回计算后的hash值,只是它是字符切片 Sum(b []byte) []byte // 重设hash为无数据输入的状态,就是清空hash之前写入的数据 Reset() // 返原创 2020-10-30 18:39:33 · 1594 阅读 · 0 评论 -
Golang 序列化之 ProtoBuf
package mainimport ( "fmt" "github.com/golang/protobuf/proto" "log")func main() { p1 := Person{ Id: *proto.Int32(1), Name: *proto.String("xieyangke"), } p2 := Person{ Id: 2, Name: "gopher", } all_p := AllPerson{ Per: []*Person{&原创 2020-10-30 14:56:13 · 386 阅读 · 0 评论 -
Golang Time
基础使用//获取秒级时间戳time.Now().Unix()//获取毫秒级时间戳time.Now().UnixNano()/1e6//格式化时间time.Now().Format("2006-01-02 15:04")//字符串转时间格式t, err := time.Parse("2006-01-02 15:04:05", "2019-05-20 18:30:50")//时间戳转为字符串t := time.Unix("1558348250", 0).Format("2006-01原创 2020-10-15 19:34:49 · 2158 阅读 · 0 评论 -
sync.Map
// Go 语言中 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的。// 并发的 map 读和 map 写,使用了两个并发函数不断地对 map 进行读和写而发生了竞态问题,map 内部会对这种并发操作进行检查并提前发现。// 需要并发读写时,一般的做法是加锁,但这样性能并不高,Go语言在 1.9 版本中提供了一种效率较高的并发安全的 sync.Map,sync.Map 和 map 不同,不是以语言原生形态提供,而是在 sync 包下的特殊结构。sync.Map 有以下特性:无须初始原创 2020-10-15 17:08:41 · 188 阅读 · 0 评论 -
go-regexp
golang Regexp主要提供如下正则所表示的16个方法:Find(All)?(String)?(Submatch)?(Index)?若带All,该方法返回一个所有递进匹配结果的slice;该方法需要额外传一个整数n,若n>=0,至多返回n个匹配或子匹配,若x<0,返回全部。若带String,该方法传入的参数需是string,否则为字节slice,返回结果也为对应的string。若带Submatch,该方法返回表达式递进的子匹配slice(子匹配匹配以括号扩起的表达式,也称作匹配组转载 2020-10-15 15:52:20 · 1014 阅读 · 0 评论 -
Golang :字符串连接的不同方法 利用字节缓冲区 bytes.Buffer 创建字符串
bytes buffer:就是写byte或者字符串string的一个容器利用字节缓冲区 bytes.Buffer 创建字符串package mainimport ( "bytes" "fmt")func main() { var buffer bytes.Buffer buffer.WriteString("www.baidu.com") buffer.WriteString(":") buffer.WriteString("welcome!") buffer.WriteStri原创 2020-10-12 17:42:19 · 1363 阅读 · 0 评论 -
GRPC的metadata使用
在http请求当中我们可以设置header用来传递数据,grpc底层采用http2协议也是支持传递数据的,采用的是metadata。 Metadata 对于 gRPC 本身来说透明, 它使得 client 和 server 能为对方提供本次调用的信息。就像一次 http 请求的 RequestHeader 和 ResponseHeader,http header 的生命周期是一次 http 请求, Metadata 的生命周期则是一次 RPC 调用。1、创建metadataMD 类型实际上是map,ke原创 2020-09-16 19:20:09 · 3679 阅读 · 0 评论 -
代码块的作用域问题
package mainimport "fmt"func main() { { v := 1 { v = 2 fmt.Println(v) // 2 } fmt.Println(v) // 2 } //fmt.Println(v) // undefined: v //作用域与标识符的定义紧密相关(更准确的说是与标识符被声明的地方) a := 10 { a := 3 fmt.Println(a) // 3 } fmt.Prin原创 2020-09-14 16:45:34 · 294 阅读 · 0 评论 -
strings 包中的函数和方法
Golang学习 - strings 包strings 包与 bytes 包中的函数用法基本一样,不再赘述。只对 Replacer 进行说明。// 转换func ToUpper(s string) stringfunc ToLower(s string) stringfunc ToTitle(s string) stringfunc ToUpperSpecial(_case unicode.SpecialCase, s string) stringfunc ToLowerSpecial(原创 2020-09-14 14:22:48 · 543 阅读 · 0 评论 -
strings.Split
strings.Split()函数用于将指定的分隔符切割字符串,并返回切割后的字符串切片。需要导入 strings包strings.Split(s, sep)s 待分割的字符串 字符串类型的参数sep 分隔符 字符串类型的参数返回一个字符串切片。Split()函数将字符串根据分隔符切割。切割后返回一个字符串切片,切片len和cap值等于原字符串中存在分隔符的数量 + 1(仅在s不是空字符串的情况下成立)。package mainimport ( "fm原创 2020-08-06 14:50:42 · 1889 阅读 · 0 评论 -
string.Replace
函数声明为:func Replace(s, old, new string, n int) string官方描述为:返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。package mainimport ( "fmt" "strings")func main() { s := "123abcabcabc123abcde123cba" old := "123" new := "888" str := strings.Replace原创 2020-08-06 15:00:54 · 1136 阅读 · 1 评论 -
json.RawMessage
在程序中使用Json时,有时某个字段其结构是根据其他字段(比如有个类型含义的字段)决定的,这个时候在解析时,需要先解析一部分,进行判断后,再解析出合适的Json结构。这时就需要用到Golang Json包的RawMessage这个对象。json.RawMessage此类型的定义为type RawMessage []byte,它还实现了json.Marshaler和json.Unmarshaler接口,可以json的延迟编解码。package mainimport ( "encoding/json"原创 2020-08-27 15:22:07 · 2025 阅读 · 0 评论 -
json.MarshalIndent
package mainimport ( "encoding/json" "fmt")type Person struct { Name string `json:"name"` Age int64 `json:"age"` Time int64 `json:"time"`}func main() { data := Person{ Name:"aaa", Age:10, Time:2001, } js,_ := json.Marshal(data) f原创 2020-09-14 11:11:31 · 954 阅读 · 0 评论 -
reflect 1
package main// 反射不能创建方法,因此你无法在运行时实现接口。// 反射的作用// 大多数情况下,如果使用interface {}类型的参数调用函数,则很可能会使用反射来检查或更改参数的值。// 反射的最常见用途是从文件或网络中序列化和反序列化数据。可以将JSON或数据库映射成指定数据结构,比如struct,slice,map等, 也可以反过来。让我们看一下如何通过查看实现JSON解组的Go标准库中的代码来完成这项工作。// 为了将JSON字符串中的值映射到变量中,我们调用json原创 2020-09-11 11:32:08 · 292 阅读 · 0 评论 -
golang - path 包的 Dir 和 Join 用法介绍
1)path 包的 Dir 用法。Dir返回路径除去最后一个路径元素的部分,即该路径最后一个元素所在的目录。在使用Split去掉最后一个元素后,会简化路径并去掉末尾的斜杠。如果路径是空字符串,会返回".";如果路径由1到多个斜杠后跟0到多个非斜杠字符组成,会返回"/";其他任何情况下都不会返回以斜杠结尾的路径。2)path 包的 Join 用法。Join函数可以将任意数量的路径元素放入一个单一路径里,会根据需要添加斜杠。结果是经过简化的,所有的空字符串元素会被忽略。package mainimp原创 2020-09-07 15:54:12 · 1669 阅读 · 0 评论 -
Golang os包下常用的系统相关操作
环境变量相关Getenv函数func Getenv(key string) string 功能:获取系统key的环境变量,如果没有环境变量就返回空示例:func main() { gopath := os.Getenv("GOPATH") fmt.Println(gopath)}Setenv函数func Setenv(key, value string) error 功能:设定环境变量,经常与Getenv连用,用来设定环境变量的值func原创 2020-09-07 14:39:04 · 1160 阅读 · 0 评论 -
sync.Once
sync.Once 是 Golang package 中使方法只执行一次的对象实现,作用与 init 函数类似。但也有所不同。init 函数是在文件包首次被加载的时候执行,且只执行一次sync.Onc 是在代码运行中需要的时候执行,且只执行一次当一个函数不希望程序在一开始的时候就被执行的时候,我们可以使用 sync.Once 。package mainimport ( "fmt" "sync")func main() { var once sync.Once onceBody原创 2020-09-07 14:04:25 · 442 阅读 · 0 评论 -
JSON Schema
package mainimport ( "context" "encoding/json" "errors" "fmt" "github.com/qri-io/jsonschema" "strings")func main() { ctx := context.Background() // JSON Schema var str = `{ "$id": "https://qri.io/schema/", "$comment" : "sample comment原创 2020-09-07 12:00:53 · 158 阅读 · 0 评论 -
实现随机数
// 生成0-8的随机数func main() { rand.Seed(time.Now().UnixNano()) who := rand.Intn(9) fmt.Println(who)}// 使用goroutine和channel实现一个随机数package mainimport ( "fmt" "math/rand" "sync" "time")type job struct { value int}type result struct { job *jo原创 2020-09-03 14:31:33 · 615 阅读 · 0 评论 -
go mod 使用 + GO111MODULE
go modules 是 golang 1.11 新加的特性。现在1.12 已经发布了,是时候用起来了。Modules官方定义为:模块是相关Go包的集合。modules是源代码交换和版本控制的单元。go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。如何使用 Modules ?把 golang 升级到 1.11(现在1.12 已经发布了,建议使用1.12)设置 GO111MODULEGO111原创 2020-08-21 10:24:53 · 8717 阅读 · 1 评论 -
go generate
go generate命令是go 1.4版本里面新添加的一个命令,当运行go generate时,它将扫描与当前包相关的源代码文件,找出所有包含"//go:generate"的特殊注释,提取并执行该特殊注释后面的命令,命令为可执行程序,形同shell下面执行。有几点需要注意:该特殊注释必须在.go源码文件中。每个源码文件可以包含多个generate特殊注释时。显示运行go generate命令时,才会执行特殊注释后面的命令。命令串行执行的,如果出错,就终止后面的执行。特殊注释必须以"//go:原创 2020-08-20 21:04:37 · 642 阅读 · 0 评论 -
json 和 结构体 转换
package mainimport ( "encoding/json" "fmt")type User struct { Id int `json:"id"` Name string `json:"name"`}func main() { //将字符串解析为结构体的形式 str := `{"id":1,"name":"yang"}` var user User //将字符串反解析为结构体 json.Unmarshal([]byte(st原创 2020-08-20 20:20:07 · 2673 阅读 · 0 评论