gangzi 发布的文章

在go中写配置文件 这样写

Cfg, err = ini.Load("conf/app.ini")

或者配置模板目录这样写

 router.LoadHTMLGlob("templates/*")

然后单元测试的时候,偏偏又找不到文件目录。

  1. 设置系统全局路径

    router.LoadHTMLGlob(filepath.Join(os.Getenv("GOPATH"),"/src/gin_curd/templates/*"))
    

2.利用模式 重写路径

if mode := gin.Mode(); mode == gin.TestMode {

router.LoadHTMLGlob("./../templates/*")

} else {

router.LoadHTMLGlob("templates/*")

}

参考:

golang单元测试时关于相对路径的处理问题?

聊一聊,Golang “相对”路径问题

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

当golang的对象需要和json做转换的时候,我们就经常用到这个特性。
有两点注意的地方:

1.如果一个域不是以大写字母开头的,那么转换成json的时候,这个域是被忽略的。

2.如果没有使用json:"name"tag,那么输出的json字段名和域名是一样的。

总结一下,json:"name"格式串是用来指导json.Marshal/Unmarshal,在进行json串和golang对象之间转换的时候映射字段名使用的。

空接口(empty interface)

空接口比较特殊,它不包含任何方法:

interface{}

在Go语言中,所有其它数据类型都实现了空接口。

var v1 interface{} = 1
var v2 interface{} = "abc"
var v3 interface{} = struct{ X int }{1}

如果函数打算接收任何数据类型,则可以将参考声明为interface{}。最典型的例子就是标准库fmt包中的Print和Fprint系列的函数:

func Fprint(w io.Writer, a ...interface{}) (n int, err error) 
func Fprintf(w io.Writer, format string, a ...interface{})
func Fprintln(w io.Writer, a ...interface{})
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{})
func Println(a ...interface{}) (n int, err error)

注意,[]T不能直接赋值给[]interface{}

t := []int{1, 2, 3, 4}
var s []interface{} = t

编译时会输出下面的错误:

cannot use t (type []int) as type []interface {} in assignment

我们必须通过下面这种方式:

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}

官方下载地址:
https://github.com/fatedier/frp/releases/

注意事项:
1.软件包含服务端和客户端,请根据系统下载

2.服务器注意开放相关的端口和防火墙

#iptables放行端口
iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
service iptables save
#firewalld放行端口
firewall-cmd --zone=public --add-port=7000/tcp --permanent
firewall-cmd --reload

3.服务端配置frps.ini

[common]
bind_port = 7000
#客户端也要设置一样的
token = 12345678
#服务端控制面板设置
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
#远程代理端口设置
vhost_http_port = 10080
vhost_https_port = 10443
#服务器端的域名设置
subdomain_host = example.com

4 服务端再持续运行

 nohup /path/frps -c /path/frps.ini &

服务端设置启动运行 把命令写进文件

/etc/rc.local

5客户端按客户端系统下载配置(frpc.ini)

[common]
server_addr = 0.0.0.0
server_port = 7000
token = 12345678

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false
remote_port = 6001

[router-web]
type = http
local_ip = 127.0.0.1
local_port = 80
use_encryption = true
use_compression = true
http_user = admin
http_pwd = admin
subdomain = web01
custom_domains = web02.yourdomain.com
locations = /abc,/def
host_header_rewrite = dev.yourdomain.com

[range:multi-port]
type = tcp
local_ip = 127.0.0.1
use_encryption = false
use_compression = false
local_port = 6010-6020,6022,6024-6028
remote_port = 16010-16020,16022,16024-16028

6.客户端运行可以widnows计划任务,liunx可以按服务端一样设置后台运行

编译python3所用到的相关依赖

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel 

可选gcc make

yum install libffi-devel

下载python3.7.4源码:

wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
tar -zxvf Python-3.7.4.tgz
cd Python-3.7.4
./configure prefix=/usr/local/python3
make && make install

编译安装Python3.7的时候报错

ModuleNotFoundError: No module named ‘_ctypes’

主要是少安装了包:

yum install libffi-devel

重新make install即可

编译安装成功

Looking in links: /tmp/tmp7f4dx6bs
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-19.0.3 setuptools-40.8.0

创建python3/pip3 软链接

ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

注意:如果 python对应python3的话, 更改yum配置,否在无法使用

vi /usr/bin/yum

把#!/usr/bin/python修改为#! /usr/bin/python2

vi /usr/libexec/urlgrabber-ext-down

把#!/usr/bin/python 修改为#! /usr/bin/python2