GO语言笔记

----安装GIT
yum install git

git config --global user.name "atean"

git config --global user.email "1272697385@qq.com"

----安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

----设置开机启动
systemctl enable docker

----启动docker
systemctl start docker

----查看运行信息
docker ps -a
ps -ef|grep docker

----容器镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["https://u37gzipr.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

----测试docker
sudo docker run hello-world

----安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

----添加权限
sudo chmod +x /usr/local/bin/docker-compose

----测试
docker-compose -v

----安装mysql
docker pull mysql:5.7

docker images

----镜像启动mysql
docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
----进入容器
docker exec -it 84fe97244ac5 /bin/bash
----创建用户并授权
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
grant all privileges on *.* to 'root'@'127.0.0.1' identified by 'root' with grant option;
grant all privileges on *.* to 'root'@'localhost' identified by 'root' with grant option;
flush privileges;

----安装redis
docker run -p 6379:6379 -d redis:latest redis-server

----安装consul
docker run -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600/udp consul consul agent -dev -client=0.0.0.0
----测试consul
dig @192.168.0.104 -p 8600 consul.service.consul SRV

----docker设置容器自动启动
docker container update --restart=always f63298283033

----安装dig
yum install bind-utils

----下载go  https://studygolang.com/dl
wget https://studygolang.com/dl/golang/go1.17.6.linux-amd64.tar.gz
----解压
tar -xvf go1.17.6.linux-amd64.tar.gz
----配置环境变量
vim ~/.bashrc
export GOROOT=/root/go
export GOPATH=/root/projects/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

source ~/.bashrc
go version
----设置代理加速
go env -w GOPROXY=https://goproxy.io,direct
go env -w GO111MODULE=on

----安装node.js
wget https://npmmirror.com/mirrors/node/v16.13.1/node-v16.13.1-linux-x64.tar.xz
tar -xvf node-v16.13.1-linux-x64.tar.xz
----建立软连接
ln -s /root/node-v16.13.1-linux-x64/bin/node /usr/bin/node
ln -s /root/node-v16.13.1-linux-x64/bin/bin/npm /usr/bin/npm

----下载protobuf
https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1

----下载go依赖包
go install github.com/golang/protobuf/protoc-gen-go

protoc --go_out=plugins=grpc:. *.proto

----安装nacos--配置中心
docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m -p 8848:8848 -d nacos/nacos-server:latest

//服务端 获取metadata
  md, ok := metadata.FromIncomingContext(ctx)
  if !ok {
     fmt.Println("metadata get err")
  } else {
     if name, ok := md["name"]; ok {
        fmt.Println(name[0])
     }
  }


  //客户端 写入metadata
  //md := metadata.Pairs("name", "张三", "pwd", "123456")
  //或
md := metadata.New(
     map[string]string{
        "name": "张三",
        "pwd":  "123456",
     })

  ctx := metadata.NewOutgoingContext(context.Background(), md)

----拦截器服务端
interceptor := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
     start := time.Now()
     fmt.Println("收到请求")
     c, r := handler(ctx, req)
     fmt.Printf("执行时间:%s\n", time.Since(start))
     return c, r
  }
  opt := grpc.UnaryInterceptor(interceptor)
  // 实例化grpc Server
  s := grpc.NewServer(opt)

----拦截器客户端
opt := grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
     start := time.Now()
     err := invoker(ctx, method, req, reply, cc)
     fmt.Printf("请求花费时间:%s\n", time.Since(start))
     return err
  })
  // 连接
conn, err := grpc.Dial(Address, grpc.WithInsecure(), opt)

----客户端快速自带metadata信息
type perRpc struct{}

func (p perRpc) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
  return map[string]string{
     "name": "张三",
     "pwd":  "123456",
  }, nil
}

// RequireTransportSecurity indicates whether the credentials requires
// transport security.
func (p perRpc) RequireTransportSecurity() bool {
  return false
}

conn, err := grpc.Dial(Address, grpc.WithInsecure(), grpc.WithPerRPCCredentials(perRpc{}))

----protoc-gen-validate 使用
go get -u github.com/envoyproxy/protoc-gen-validate
下载windows .exe文件 https://oss.sonatype.org/content/repositories/snapshots/io/envoyproxy/protoc-gen-validate/protoc-gen-validate/0.6.3-SNAPSHOT/protoc-gen-validate-0.6.3-20211021.193822-1-windows-x86_64.exe
github  https://github.com/envoyproxy/protoc-gen-validate/blob/main/validate/validate.proto
复制 https://github.com/envoyproxy/protoc-gen-validate/blob/main/validate/validate.proto 文件里面的内容至本地 validate.proto
protoc --go_out=plugins=grpc:. --validate_out="lang=go:." *.proto

----GRPC反解err
  s, ok := status.FromError(err)
   if !ok {
       fmt.Println("解析err失败")
   }
   fmt.Println(s.Code())
   fmt.Println(s.Message())

----安装yapi
git clone https://github.com/Ryan-Miao/docker-yapi.git
cd docker-yapi

vim docker-compose.yml
删除 command: "yapi server" 前面的 #号和一个空格,一定要对齐,一定要对齐,一定要对齐,一定要对齐
在 command: "node /my-yapi/vendors/server/app.js" 前面添加一个空格

docker-compose up

----安装gorm
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

根据结构体自动生成数据表
db.AutoMigrate(&Product{})

  newLogger := logger.New(
         log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
logger.Config{
            SlowThreshold:             time.Second, // 慢 SQL 阈值
LogLevel:                  logger.Info, // 日志级别
IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误
Colorful:                  true,        // 禁用彩色打印
},
      )

      dsn := "root:root@tcp(192.168.0.103:3306)/go_test?charset=utf8mb4&parseTime=True&loc=Local"
      db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
         Logger: newLogger,
      })

      // Create
          db.Create(&Product{Code: "D42", Price: 100})

          // Read
          var product Product
          db.First(&product, 1)                 // 根据整形主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录

// Update - 将 product 的 price 更新为 200
          db.Model(&product).Update("Price", 200)
          // Update - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})

          // Delete - 删除 product
          db.Delete(&product, 1)


最后编辑于:2022/02/15作者: 牛逼PHP

发表评论