西维蜀黍

【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 。

  ...