JIT(Just-In-Time)Compiler
是在程序开始运行以后,在执行过程中把代码(通常是字节码或虚拟机指令)转化成另外一种运行更快的指令,通常就是程序所在机器的CPU
指令集。与之相比,传统的编译器则会在程序运行之前就把所有代码编译成机器指令。
Go语言“:=”用法浅析
Go
语言中可以使用“:=
”为一个新的变量完成声明以及初始化的工作,如下例所示:
i := 1
等价于:
var i = 1
要注意语句中没有变量类型,不是var i int = 1
。
“:=
”不能重新声明一个已经声明过的变量,如下例所示:
package main
import "fmt"
func main() {
var i = 1
i := 2
fmt.Println(i)
}
编译结果:
C:/Go\bin\go.exe run C:/Work/go_work/Hello.go
# command-line-arguments
.\Hello.go:8: no new variables on left side of :=
错误的原因是变量被重复声明了。
但使用“:=
”为多个变量赋值时,如果引入了至少一个新的变量,编译是可以通过的,如下例所示:
package main
import "fmt"
func main() {
var i = 1
i, err := 2, false
fmt.Println(i, err)
}
编译执行:
C:/Go\bin\go.exe run C:/Work/go_work/Hello.go
2 false
要注意这个时候,并没有重新声明“i
”变量,只是为之前声明的“i
”变量赋值。
“:=
”只能用在函数体中。它的一个重要用途是用在“if
”,“for
”和“switch
”语句的初始化,使变量成为一个“临时变量”,也就是变量的作用域仅限于这条语句。如下例所示:
package main
import "fmt"
func main() {
for j := 3; j <= 5; j++ {
fmt.Println(j)
}
fmt.Println(j)
}
编译结果:
C:/Go\bin\go.exe run C:/Work/go_work/Hello.go
# command-line-arguments
.\Hello.go:11: undefined: j
“j
”的声明作用域仅限于“for
”语句,所以编译第二个打印语句会出错。
参考资料:
(1)Short variable declarations;
(2)Assignment operator in Go language。
GOROOT和GOPATH
GOROOT
指向Go
开发包的安装目录。从Go 1.0
开始,不必显示地设置GOROOT
环境变量。Windows
安装包将会自动设置GOROOT
,默认装在C:\Go
:
GOROOT=C:\Go\
而在*nix
环境下,下载Go
安装包并解压在/usr/local/
目录下,然后把/usr/local/go/bin
加入PATH
环境变量即可:
export PATH=$PATH:/usr/local/go/bin
如果Go
安装包没有安装在默认的目录下(Windows
为C:\Go
,*nix
为/usr/local/go
),则需要手动设置GOROOT
,举个例子(*nix
):
export GOROOT=$HOME/go
GOPATH
指定了Go
工程目录,包含src
,pkg
和bin
三个子目录。这是开发Go
程序时,唯一需要显示设置的环境变量。当使用go get
目录下载Go
第三方程序包时,也会安装在这个目录下。此外,为了方便,要记得把$GOPATH/bin
也加到PATH
环境变量:
export PATH=$PATH:$GOPATH/bin
另外,根据这个帖子的推荐,设置一个GoPATH
足够了。
参考资料:
1. Easy Go Programming Setup for Windows;
2. You don’t need to set GOROOT, really;
3. How to Write Go Code;
4. Go Getting Started。
解决编译错误“fatal error: ‘libelf.h’ file not found”
原文发布于hellogcc网站。
最近在编译一个开源项目时,遇到这个编译错误:
fatal error: 'libelf.h' file not found
#include <libelf.h>
^
1 error generated.
解决方法是安装elfutils-libelf-devel
这个软件包:
yum install elfutils-libelf-devel
或:
dnf install elfutils-libelf-devel
在CentOS 7上安装clang
Git clone命令笔记
git clone
命令用来拷贝一个已经存在的代码仓库。Clone
操作会自动创建一个指向原始代码仓库的远程连接(名字是origin
),这会很方便操作中央代码库。git
的合作开发模式是基于“代码仓库-代码仓库”(repository-to-repository
),不同于SVN
的从工作拷贝向中央代码仓库提交代码的方式,git
的push
或pull
操作都是从一个代码仓库到另一个代码仓库。
使用:
a)git clone <repo>
把位于repo
的代码仓库复制到本机。
b)git clone <repo> <directory>
把位于repo
的代码仓库复制到本机的directory
。
例子:
[root@CentOS ~]# git clone https://github.com/sharklinux/shark
Cloning into 'shark'...
remote: Counting objects: 1003, done.
remote: Total 1003 (delta 0), reused 0 (delta 0), pack-reused 1003
Receiving objects: 100% (1003/1003), 21.43 MiB | 304.00 KiB/s, done.
Resolving deltas: 100% (245/245), done.
[root@CentOS ~]# ls
anaconda-ks.cfg shark
执行git clone https://github.com/sharklinux/shark
在本机初始化一个shark
文件夹(注意没有.git
后缀,表明这是一个非bare
属性的本地拷贝),文件夹里包含了整个shark
代码仓库的所有内容。
参考资料:
git clone。
解决“Warning: Cannot modify header information – headers already sent by …”的问题
中午变化了一下博客主题,结果就登不上了。提示错误如下:
Warning: Cannot modify header information - headers already sent by (output started at /home/to/public_html/en/wp-content/themes/nordby/functions.php:78) in /home/to/public_html/en/wp-login.php on line 418
Warning: Cannot modify header information - headers already sent by (output started at /home/to/public_html/en/wp-content/themes/nordby/functions.php:78) in /home/to/public_html/en/wp-login.php on line 431
问题出在/home/to/public_html/en/wp-content/themes/nordby/functions.php
这个文件上。这是错误的文件截图,可以看到结尾有空白行:
修改成这样就可以了:
参考资料:
Cannot modify header information – headers already sent by …。
Git init命令笔记
git init
命令用来创建一个新的Git
仓库。它既可以用来完全初始化一个新的空仓库,也可以把一个已经存在的,没有版本控制的仓库转成Git
仓库。执行git init
命令会在指定工程的根目录下创建一个.git
的子文件夹。除了.git
子文件夹,工程的其它文件都不会改变。
使用:
a)git init
把当前目录变成一个Git
仓库。
b)git init <directory>
在指定的目录下创建Git
仓库。执行这个命令将会创建一个叫directory
的新文件夹,在这个文件夹里只有.git
子文件夹。
c)git init --bare <directory>
初始化一个没有工作文件夹的空的Git
仓库。用来共享的Git
仓库应该始终使用--bare
选项来创建。通常情况下,用--bare
选项初始化的仓库以.git
作为后缀。举个例子,使用--bare
选项创建的project
仓库应该叫project.git
。
比较一下git init <directory>
和git init --bare <directory>
:
首先执行git init linux
:
[root@CentOS ~]# git init linux
Initialized empty Git repository in /root/linux/.git/
[root@CentOS ~]# ls -alt linux/
total 8
dr-xr-x---. 5 root root 4096 Jun 2 12:53 ..
drwxr-xr-x. 7 root root 4096 Jun 2 12:42 .git
drwxr-xr-x. 3 root root 17 Jun 2 12:42 .
[root@CentOS ~]# ls -alt linux/.git
total 20
drwxr-xr-x. 7 root root 4096 Jun 2 12:42 .
drwxr-xr-x. 4 root root 28 Jun 2 12:42 objects
-rw-r--r--. 1 root root 92 Jun 2 12:42 config
-rw-r--r--. 1 root root 23 Jun 2 12:42 HEAD
drwxr-xr-x. 2 root root 20 Jun 2 12:42 info
drwxr-xr-x. 2 root root 4096 Jun 2 12:42 hooks
-rw-r--r--. 1 root root 73 Jun 2 12:42 description
drwxr-xr-x. 2 root root 6 Jun 2 12:42 branches
drwxr-xr-x. 3 root root 17 Jun 2 12:42 ..
drwxr-xr-x. 4 root root 29 Jun 2 12:42 refs
接着执行git init --bare bsd
:
[root@CentOS ~]# git init --bare bsd
Initialized empty Git repository in /root/bsd/
[root@CentOS ~]# ls -lt bsd
total 16
drwxr-xr-x. 4 root root 28 Jun 2 13:01 objects
-rw-r--r--. 1 root root 66 Jun 2 13:01 config
drwxr-xr-x. 2 root root 6 Jun 2 13:01 branches
-rw-r--r--. 1 root root 73 Jun 2 13:01 description
-rw-r--r--. 1 root root 23 Jun 2 13:01 HEAD
drwxr-xr-x. 2 root root 4096 Jun 2 13:01 hooks
drwxr-xr-x. 2 root root 20 Jun 2 13:01 info
drwxr-xr-x. 4 root root 29 Jun 2 13:01 refs
可以看到所有的文件信息都直接创建在bsd
目录下,而没有创建在.git
文件夹下。
参考文档:
git init
解决screen会话闪烁的问题
使用GNU screen
创建多个工作会话时,使用时可能会遇到会话屏幕闪烁的问题。比如在命令行使用backspace
把所有字符都删除完以后,或是man
某个命令翻到最后一页还接着往下翻,等等。原因是visual bell
在捣鬼。解决方法如下:
(1)编辑“~/.screenrc
”文件;
(2)加入以下行:
vbell_msg "bell: window ~%" # Message for visual bell
vbellwait 2 # Seconds to pause the screen for visual bell
vbell off # Turns visual bell off
参考文档:
http://stackoverflow.com/questions/897358/gnu-screen-refresh-problem。
Lttng安装简介
本文参考自Lttng
的官方文档。
(1)安装Lttng
:
我使用的是CentOS
,所以按照RHEL
的文档,使用yum
方式安装:
a)构建package
相关信息:
wget -P /etc/yum.repos.d/ http://packages.efficios.com/repo.files/EfficiOS-RHEL7-x86-64.repo
rpmkeys --import http://packages.efficios.com/rhel/repo.key
yum updateinfo
b)接下来安装lttng
软件包:
yum install lttng-ust-devel #安装 lttng-ust会同时安装liburcu0
yum install kmod-lttng-modules
yum install lttng-tools-devel
yum install babeltrace-devel
(2)测试一下:
lttng create my-session
lttng enable-event --kernel --all
lttng start
lttng stop
lttng stop
lttng destroy
接着执行ls
命令:
[root@CentOS ~]# ls
anaconda-ks.cfg lttng-traces
可以看到抓的trace
都在lttng-traces
这个文件夹里。