西维蜀黍

【Network】电信光猫内网穿透

Environmental Info

天翼网关-GPON,型号: PT921G

  ...


【Golang】使用 - Golang 使用 UUID

什么是 UUID?

UUID 是Universally Unique Identifier的缩写,即通用唯一识别码。

uuid的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 uuid。

A universally unique identifier (UUID) is a 128-bit number used to identify information in computer systems.

  ...


【Golang】Golang 的环境变量

一句话概括,GOPATH中保存的是第三方依赖库的内容,GOROOT中保存的是原生的 go 工具的内容。

GOPATH

该环境变量的值为 Go 语言的工作区的集合(意味着可以有很多个)。工作区类似于工作目录。每个不同的目录之间用:分隔。

工作区是放置 Go 源码文件的目录。一般情况下,Go 源码文件都需要存放到工作区中。

工作区一般会包含3个子文件夹,自己手动新建以下三个目录:src 目录,pkg 目录,bin 目录。

bin 目录里面存放的都是通过 go install 命令安装后,由 Go 命令源码文件生成的可执行文件( 在 Mac 平台下是 Unix executable 文件,在 Windows 平台下是 exe 文件)。

  ...


【Golang】依赖管理 - go module

Background

GOPATH的痛

当有多个项目时,不同项目对于依赖库的版本需求不一致时,无法在一个GOPATH下面放置不同版本的依赖项。典型的例子:当有多项目时候,A项目依赖C 1.0.0,B项目依赖C 2.0.0,由于没有依赖项版本的概念,C 1.0.0和C 2.0.0无法同时在GOPATH下共存,解决办法是分别为A项目和B项目设置GOPATH,将不同版本的C源代码放在两个GOPATH中,彼此独立(编译时切换),或者C 1.0.0和C 2.0.0两个版本更改包名。无论哪种解决方法,都需要人工判断更正,不具备便利性。

  ...


【Golang】Golang 使用 gRPC

定义 gRPC的.proto

syntax = "proto3";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}
  ...


【Golang】Golang 连接 MySQL

安装

$ go get -u github.com/go-sql-driver/mysql

mysql数据库连接

  • 构建连接, 格式是:“用户名:密码@tcp(IP:端口)/数据库?charset=utf8”
  • 打开数据库,前者是驱动名,所以要导入: _ “github.com/go-sql-driver/mysql”
  • 设置数据库最大连接数和设置上数据库最大闲置连接数
  • 验证连接:使用Ping()函数
package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"time"
)


//数据库配置
const (
	userName = "root"
	password = "123456"
	ip = "127.0.0.1"
	port = "3306"
	dbName = "test"
)

func InitDB()  {
  path := strings.Join([]string{userName, ":", password, "@tcp(",ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
	db, error := gorm.Open("mysql", path)

	// if there is an error opening the connection, handle it
	if err != nil {
		panic(err.Error())
	}

	results, err := db.Query("select * from tb")
	fmt.Println(results)
	for results.Next() {
		var promotion Promotion
		// for each row, scan the result into our tag composite object
		err = results.Scan(&promotion.id, &promotion.c1, &promotion.c2)
		if err != nil {
			panic(err.Error()) // proper error handling instead of panic in your app
		}
	}
}

type Promotion struct {
	id int
	c1 string
	c2 string

}

func main() {
	InitDB()
}
  ...


【Golang】修改代码后自动重新编译并启动

在开发 Go 的 Web 项目的过程中,让新增加或者修改的代码被自动编译并重启项目是一件可以提高工作效率的事情。

For Web Applications

Gin(https://github.com/codegangsta/gin)

$ go get github.com/codegangsta/gin

$ cd /home/project/myblog

$ gin

如果 main.go 文件不在根目录下,则通过 -d 来指定main.go 文件所在的文件夹

$ gin -d Gateway/main

这时控制台就开始编译打包执行了,注意控制台返回的信息,能知道项目的编译错误和日志,最后会有访问 url。

如果发现项目中有 go 文件新增或修改,gin 和 fresh 都会智能 reload 。

  ...


【Golang】使用 gorm(ORM 框架)

Install

$ go get -u github.com/jinzhu/gorm
  ...


【Golang】Web Framework - Gin 使用

路由

gin 框架中采用的路由库是 httprouter。

// 创建带有默认中间件的路由:
// 日志与恢复中间件
router := gin.Default()

router.GET("/someGet", getting)
router.POST("/somePost", posting)
router.PUT("/somePut", putting)
router.DELETE("/someDelete", deleting)
router.PATCH("/somePatch", patching)
router.HEAD("/someHead", head)
router.OPTIONS("/someOptions", options)
  ...


【Golang】Print

Println 与Printf

Println 与Printf 都是fmt 包中的公共方法,在需要打印信息时,会用到这二个函数,那么这二个函数有什么区别呢?

  • Println():可以打印出字符串,和变量;
  • Printf():只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形

也就是说,当需要格式化输出信息时一般选择 Printf,其他时候用 Println 就可以了,比如:

func main() {
	a := 10
	fmt.Println(a)
	fmt.Println("abc","d")
	fmt.Printf("%d",a)
}

我们发现:

  • 在调用fmt.Println()时,可以提供多个 string,且在打印时,会自动在这些 string 之间加上空格。
  • 在调用fmt.Printf()时,需要指定 format,如 C 语言中那样。
  ...