Gin和grpc搭建-学习Go语言

安装grpc

如果你遇到这样的错误

package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc"(https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

解决方案,采用最新github的地址。

git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto

cd $GOPATH/src/
go install google.golang.org/grpc

继续报错:

google.golang.org/grpc/internal/channelz/types_linux.go:26:2: cannot find package "golang.org/x/sys/unix" in any of:
    /usr/local/go/src/golang.org/x/sys/unix (from $GOROOT)
    /go/src/golang.org/x/sys/unix (from $GOPATH)

解决方案,依然采用github的地址。

git clone https://github.com/golang/sys.git $GOPATH/src/golang.org/x/sys

gin框架

如果你想执行gin的example的例子。

go run grpc/server.go
grpc/server.go:7:2: cannot find package "github.com/gin-gonic/gin/examples/grpc/pb" in any of:
    /usr/local/go/src/github.com/gin-gonic/gin/examples/grpc/pb (from $GOROOT)
    /go/src/github.com/gin-gonic/gin/examples/grpc/pb (from $GOPATH)

解决方案,拉取gin的包。

go get -u github.com/gin-gonic/gin

参考链接

  1. golang安装gRpc

单元测试-学习Go语言

实现

采用自身的testing包实现。

踩坑

单元测试和源文件必要放在同一个目录下,才可以正常执行。

Go PHPUnit
*_test文件和源文件一起 必须 任意
断言 第三方库 支持
mock 支持 支持

语法

执行单元测试

go test -v -cover=true ./src/rpc/client_test.go ./src/rpc/client.go

简单的断言

/*
* @Author: GeekWho
* @Date:   2018-07-20 11:33:43
* @Last Modified by:   GeekWho
* @Last Modified time: 2018-07-20 12:29:33
*/
package rpc

import (
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestRun(t *testing.T) {
    assert.Equal(t, "rpc", "rpc")
}

基础-学习Go语言

1. 每个 Go 程序都是由包构成的。
2. 程序从 main 包开始运行。
3. 本程序通过导入路径 “fmt” 和 “math/rand” 来使用这两个包。
4. 按照约定,包名与导入路径的最后一个元素一致。例如,”math/rand” 包中的源码均以 package rand 语句开始。

导出名

1. 在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的。例如,Pizza 就是个已导出名,Pi 也同样,它导出自 math 包。
2. pizza 和 pi 并未以大写字母开头,所以它们是未导出的。
3. 在导入一个包时,你只能引用其中已导出的名字。任何“未导出”的名字在该包外均无法访问。

函数

1. 函数可以没有参数或接受多个参数。
2. 在本例中,add 接受两个 int 类型的参数。
3. 注意类型在变量名 之后。
4. 当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略。

多值返回

1. 函数可以返回任意数量的返回值。

命名返回值

1. Go 的返回值可被命名,它们会被视作定义在函数顶部的变量。
2. 返回值的名称应当具有一定的意义,它可以作为文档使用。
3. 没有参数的 return 语句返回已命名的返回值。也就是 直接 返回。
4. 直接返回语句应当仅用在下面这样的短函数中。在长的函数中它们会影响代码的可读性。

变量

变量的初始化

1. var 语句用于声明一个变量列表,跟函数的参数列表一样,类型在最后。就像在这个例子中看到的一样,var 语句可以出现在包或函数级别。
2. 变量声明可以包含初始值,每个变量对应一个。如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型。

短变量声明

1. 在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。函数外的每个语句都必须以关键字开始(var, func 等等),因此 := 结构不能在函数外使用。

基本类型

Go 的基本类型有

bool

string

int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr

byte // uint8 的别名

rune // int32 的别名
// 表示一个 Unicode 码点

float32 float64

complex64 complex128

1. 本例展示了几种类型的变量。 同导入语句一样,变量声明也可以“分组”成一个语法块。
2. int, uint 和 uintptr 在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽。 当你需要一个整数值时应使用 int 类型,除非你有特殊的理由使用固定大小或无符号的整数类型。

零值

1. 没有明确初始值的变量声明会被赋予它们的 零值。

零值是:

– 数值类型为 0,
– 布尔类型为 false,
– 字符串为 “”(空字符串)。

类型转换

1. 表达式 T(v) 将值 v 转换为类型 T。
2. Go 在不同类型的项之间赋值时需要显式转换。

类型推导

1. 在声明一个变量而不指定其类型时(即使用不带类型的 := 语法或 var = 表达式语法),变量的类型由右值推导得出。
2. 不过当右边包含未指明类型的数值常量时,新变量的类型就可能是 int, float64 或 complex128了,这取决于常量的精度:

常量

1. 常量的声明与变量类似,只不过是使用 const 关键字。
2. 常量可以是字符、字符串、布尔值或数值。
3. 常量不能用 := 语法声明。

数值常量

1. 数值常量是高精度的 值。
2. 一个未指定类型的常量由上下文来决定其类型。
3. 再尝试一下输出 needInt(Big) 吧。

参考链接

1. Go指南中文版

请专注于学习续

今天的两个java题目,题目具体记得不太清楚
1.输出结果s=a+aa+aaa+…+aaaa…a(最后一项有n个a)。如a=3,n=4,则s=3+33+333+3333,其中a和n由用户输入
2.题目大概是输入一个数,分别输出这个数的每一位。
我已经搞定,参考了知道的回答,源代码如下:
第一题目:

[cce]
/**
*引入Scanner类,读取控制台输入
*引入Math类,读取控制台输入
*/
import java.util.Scanner;
import java.lang.Math;
public class artur_1{
//实例化Scanner对象
private Scanner scanner = new Scanner(System.in);
private int a,i;
private int n;
private int sum=1,s=1;
artur_1(){
System.out.println(“请输入a,n:”);
//获取a
a = scanner.nextInt();
//获取n
n = scanner.nextInt();
//输出a
System.out.println(“a=”+a);
System.out.println(“n=”+n);
}
//累加函数
public int addNum(){
//先算出1+11+111+111
for(i=1;i<n;i++){
s+=Math.pow(10,i);sum+=s;
}
//再算出a+aa+aaa+aaa
sum = a * sum;
//返回sum
return sum;
}
public static void main(String[] args){
//调用构造函数实例化
artur_1 swk = new artur_1();
//调用累加函数
swk.sum = swk.addNum();
//输出结果
System.out.println(“a+aa+aaa+aaa..a(n)的结果为:”+swk.sum);
}
}
[/cce]

第二题目:

[cce]
import java.util.Scanner;
public class artur_2
{
private Scanner scanner = new Scanner(System.in);
private int n,a;
private int sum = 1;
artur_2(){
System.out.println(“请输入n:”);
//获取a
n=scanner.nextInt();
//输出a
System.out.println(“n=”+n+” 结果为:”);
}
//显示结果
public int show(){
//算法主要是取余%,再去掉已经取了的余数
while( n! = 0 ){
a=n%10;
System.out.println(” “+a);
n/=10;
}
return n;
}
public static void main(String[] args){
//实例化
artur_2 swk = new artur_2();
//显示结果
swk.show();
}
}
[/cce]