build多个导入路径

前面介绍build命令时,对象都是单个的,接下来看看如果同时build多个对象会怎样,要分为三种情况:多个目录,多个文件,以及目录和文件共存。

目录和文件共存

如果同时build目录和文件

1
2
➜  examples go build ./test.go temp/
named files must be .go files: temp/

完全不可行,只要编译对象中出现了以“.go”为名字后缀的源代码文件,其他对象就不能是目录。

多个文件

  1. 文件列表必须全部都是go源代码文件,不能包含其他类型的文件。

    1
    2
    ➜  example7 go build test.txt example7.go 
    named files must be .go files: test.txt

    同时.go文件和.txt文件直接报错了:要求所有文件只能是go文件。

  2. 所有文件必须来自同个目录。

    1
    2
    ➜  example7 go build example7.go dir0/tmp.go 
    named files must all be in one directory; have . and dir0

​ 同时编译当前目录下的examle7.go和子目录dir0下的tmp.go,就会报错:要求所有文件位于同一目录。

阅读全文 »

build单个导入路径

单个文件

golang要求源代码文件必须以“.go”作为名字后缀,这样才可以被build等命令行工具识别。

  1. 文件名后缀不是“.go”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ➜  example0 cat ./example0.go
    package example0
    ➜ example0 cat ./example0.txt
    package example0
    ➜ example0 go build -n ./example0.go
    #
    # command-line-arguments
    #
    mkdir -p $WORK/b001/
    cat >$WORK/b001/importcfg << 'EOF' # internal
    # import config
    EOF
    cd /home/Admin/projects/examples/example0
    /home/Admin/.g/go/pkg/tool/linux_arm64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p command-line-arguments -complete -buildid Vw6mBaJb5SUht4kgt4T9/Vw6mBaJb5SUht4kgt4T9 -goversion go1.18 -c=4 -D _/home/Admin/projects/examples/example0 -importcfg $WORK/b001/importcfg -pack ./example0.go
    /home/Admin/.g/go/pkg/tool/linux_arm64/buildid -w $WORK/b001/_pkg_.a # internal
    ➜ example0 go build -n ./example0.txt
    cannot find package "." in:
    /home/Admin/projects/examples/example0/example0.txt

    两份文件内容是一样的,都只有一句package声明;编译go文件是正常的;但是编译txt文件会报错,说明golang的源代码文件名要以“.go”结尾。

    阅读全文 »

前言

本系列文章不打算像其他介绍golang的文章一样,从“hello world”开始,先介绍golang源代码怎么写;相反,我要从工程角度先介绍golang程序是怎么运行起来的,再介绍具体语法,即golang源代码怎么写。

作为传承自C语言的静态语言,golang程序在运行之前也要先进行编译,生成可执行文件,才可以交给操作系统去运行。这不同于Python、Javascript等动态类型语言,它们是解释执行的。

golang使用go build命令编译源代码文件。

阅读全文 »

Redis分布式锁

无论使用哪种技术组件,做分布式锁都要满足四个基本要求:

  1. 互斥性:同一个时刻,只能又一个客户端获取到锁,在它解锁之前,其他客户端无法加锁;

  2. 不能死锁:加锁和解锁这两个动作必须成对出现,加锁后必须解锁,否则其他客户端就无法再加锁;

  3. “解铃还须系铃人”:同一把锁,其加锁和解锁两个动作必须由同一个客户端完成,即一个客户端不能释放另一个客户端加的锁;

  4. 容错性:不能出现单点故障,锁的实现者或提供者必须保证客户端可以稳定的获取到锁;

    阅读全文 »

遇到的问题:

当浏览器访问某个文件(比如图片、css文件、js文件)时,若该文件有缓存且尚未失效,那么浏览器会直接从缓存中读取该文件,即使服务器上该文件已经发生了更新。然而有些情况下,我们需要客户在页面使用该文件的最新版本,即便它在浏览器被缓存。

解决思路:
1、每次文件在服务器有更新,上线之后告诉所有用户,要清除浏览器缓存才可以使用;
优点:简单省事 缺点:给运营及客户造成不便,容易挨揍
2、强制文件不使用缓存,每次浏览器访问都需要从服务器获取;
优点:开发成本低 缺点:页面访问速度下降;服务器压力增加
3、更聪明的办法

阅读全文 »
0%