## 语言变化
### slice转数组
Go1.17在语言层面开始支持将slice转为指向数组的指针。
示例如下:
```go
s := make([]byte, 2, 4)
// 将s这个slice转为指向byte数组的指针s0
// 其中[0]byte里的0表示数组的长度,虽然长度为0,但值不等于nil
s0 := (*[0]byte)(s) // s0 != nil
fmt.Printf("%T")
// 将s[1:]这个slice转为指向byte数组的指针s1
// s1指向的数组的长度为1
s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1]
// 将s这个slice转为指向byte数组的指针s2
// s2指向的数组的长度为2
s2 := (*[2]byte)(s) // &s2[0] == &s[0]
// 将s这个slice转为指向byte数组的指针s4
// s4指向的数组的长度为4
s4 := (*[4]byte)(s) // panics: len...
基于ZooKeeper和etcd实现服务的注册和发现功能,先讲ZooKeeper。
## ZooKeeper
### 服务注册
1. 利用临时节点的特性,创建一个服务的临时节点,关联服务信息数据,当服务不可用时会话超时,临时节点会被删除,就起到了心跳的作用。
2. 给这个临时节点注册一个`watch`监视数据,不存在了可以及时重新注册服务信息。
### 服务注册
服务发现是利用`watch`的特性,首先获取一遍需要的服务信息,保存在本地,然后给这个服务节点添加`watch`,监视变化和更新。
## etcd
### 服务注册
服务注册是利用了etcd租约的特性。
首先创建一个定时的租约,比如10秒,20秒等。
然后带租约存储服务信息,不断的续期租约,当服务不可用时,租约过期,服务数据就会被删除,就相当于心跳保活了。
### 服务注册
服务发现和zookepper类似,是利用了etcd的`watch`的特性,首先获取一遍需要的服务的信息,再监视变化和更新。
看原理是不是都很简单呢?主要是怎么实...
go的AES加密主要用`crypto/aes`和`crypto/cipher`两个库来实现。
AES加密模式又好多种,这里研究了6种模式:CBC、CFB、OFB、ECB、CTR、GCM模式。
一看到这么多模式,如果那里需要用到一下都不知道哪种好,这里大概总结一下。
如果数据通过非对称签名进行身份验证,则使用CBC,否则使用GCM。
最好的模式是GCM模式,GCM可以保证数据的保密性和完整性,其他模式只能保证保密性,不能保证完整性,具体可以去了解下AEAD。
GCM模式属于AEAD加密。
所以除了GCM模式之外其他模式最好是增加hmac哈希,用来验证数据完整性。
ECB模式不建议使用,因为这种模式不安全,go的内置库也没有去实现这种模式。
go AES 6种加密模式代码:https://github.com/ilaziness/gopkg/tree/main/crypto/aes
iv值的生成可以参考cfb模式的代码,每次加密都是随机生成的。...
Gin模型数据绑定验证器用的是go-playground/validator/v10。默认提示是英文内容,我们需要翻译成中文内容。
创建一个文件`validator.go`:
```go
package utils
import (
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/locales/en"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhtranslations "github.com/go-playground/validator/v10/translations/zh"
"log"
)
var trans ut.Translator
//设置验证器中文翻译
func init() {
if trans != nil {
...
go从1.11版本开始,实验性的加入了`WebAssembly`的支持。
## `hellow world`程序
```go
package main
import "fmt"
func main() {
fmt.Println("Hello, WebAssembly!")
}
```
设置go编译`WebAssembly`环境变量值,`GOOS=js`和`GOARCH=wasm`。
设置方法有两种:
- 修改默认变量值,执行命令:`go env -w GOOS=js GOARCH=wasm`
- 编译的时候指定值:`cd`到项目根目录,执行命令:`GOOS=js GOARCH=wasm go build -o main.wasm`
这时将生成一个`main.wasm`文件,`.wasm`后缀的文件可以通过`http`设置合适的`Content-Type`http头来使用。
需要注意的一点是,只能编译`main`包,否则是不能在`WebAssembly`里面使用的。
**在浏览器里面运行`main.wasm`**
...
服务器端:package main
import (
"bufio"
"bytes"
"fmt"
"net"
"os"
"strconv"
"time"
)
var User map[string]*net.TCPConn
func main() {
var tcpAddr *net.TCPAddr
var tcpListen *net.TCPListener
var tcpConn *net.TCPConn
var err error
User = make(map[string]*net.TCPConn)
//监听端口
tcpAddr, err = net.ResolveTCPAddr("tcp4", ":5000")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
//监听
tcpListen, err = net.ListenTCP("tcp4", t...
文章是翻译自Go官方博客的文章:http://blog.golang.org/errors-are-values随便翻译的一下,给自己参考,有需要的同学也可以参考参考,翻译的不好的地方或者难以理解的地方请参考原文。本人英语本身也不怎么样!所有有可能会有理解错误,用词不当,语言组织不当的地方,请见谅!该怎么样去处理错误(errors),是go程序员特别是刚学go的人之间的一个共同讨论点。讨论经常会随着下面这段程序出现的次数越来越多而变成抱怨。if err != nil {
return err
}我们最近扫描了所有我们能够找到的开源项目,发现重复出现这段代码的次数是每页或者每两页只出现了一次,是不是比你想象中的要少很多。然而,如果你还是感觉必须到处写if err != nil,那一定是哪里出了问题,并且会认为问题很明显是出在go自己身上。很不幸,这是错误的,而且这很容易去纠正。假如一个新手go程序员去提问这发生了什么,“怎么会只有一个错误处理?”,其实你应该学习这种模式,并且保持它。在其他编程语言里面,一种可能方式是使用try-catch块或者其他类似原理的方式去处理错误(err...
go有一个官方包来操作json格式的数据,包位于encoding/json。JSON编码func Marshal(v interface{}) ([]byte, error)返回用JSON编码v之后的值。类型转换规则:boolean值会编码成JSON的boolean;float,integer会编码成JSON的number;string值会编码成UTF-8JSON字符串,无效的字节用Unicode替换,"<"和">"编码成"\u003c" and "\u003e","&"编码成"\u0026";array和slice会编码成JSON array,[]byte编码成base64字符串,空的slice编码成null;struct会编码成JSON object。空值是指false,0,空指针或者空interface,任何长度为0的array,slice,map或者string。json对象默认的key字符串是strut的字段名,也可以自己指定名字,方法是在每个字段最后用“json”标签指定名字:比如:type Personal struct {
Name stri...
本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对单元测试),包括基本技术、高级技术(并发测试、mock/fake、竞争条件测试、并发测试、内/外部测 试、vet工具等)等,感觉总结的很全面,这里整理记录下来,希望能给大家带来帮助。原Slide访问需要自己搭梯子。另外这里也要吐槽一 下:Golang官方站的slide都是以一种特有的golang artical的格式放出的(用这个工具http://go-talks.appspot.com/可以在线观看),没法像pdf那样下载,在国内使用和传播极其不便。转载自:http://tonybai.com/2014/10/22/golang-testing-techniques/一、基础测试技术1、测试Go代码Go语言内置测试框架。内置的测试框架通过testing包以及go test命令来提供测试功能。下面是一个完整的测试strings.Index函数的完整测试文件://strin...
其实这样的程序随便搜一下一大把!这里纯粹练习用的,然后模仿的和windows上面的Ping程序一模一样。这里参考了这篇博文:http://my.oschina.net/ybusad/blog/300155ping程序发的是icmp包,这个协议和tcp、udp协议是在同一层的。包结构如下: 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ...