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安装包没有安装在默认的目录下(WindowsC:\Go*nix/usr/local/go),则需要手动设置GOROOT,举个例子(*nix):

export GOROOT=$HOME/go

GOPATH指定了Go工程目录,包含srcpkgbin三个子目录。这是开发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

Git clone命令笔记

git clone命令用来拷贝一个已经存在的代码仓库。Clone操作会自动创建一个指向原始代码仓库的远程连接(名字是origin),这会很方便操作中央代码库。git的合作开发模式是基于“代码仓库-代码仓库”(repository-to-repository),不同于SVN的从工作拷贝向中央代码仓库提交代码的方式,gitpushpull操作都是从一个代码仓库到另一个代码仓库。

使用:

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这个文件上。这是错误的文件截图,可以看到结尾有空白行:

err

修改成这样就可以了:

right

参考资料:
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这个文件夹里。

我设计的第一款*nix geek T恤

今天是“六一”儿童节,首先祝大家节日快乐,永葆童心!另外,我设计的第一款*nix geek T恤也于今天正式上线了:*NIX Geek 主题T恤

我使用过多种*nix操作系统:SoalrisLinuxMac OS X等等,也一直对*nix上的debuggingtracing工具感兴趣:DTraceLttngperf等等。所以我萌生了为这些工具设计一款T恤的想法。

Deirdré Straughan女士(个人网站:http://www.beginningwithi.com/)为这些工具设计了以矮种马(pony)为原型的吉祥物(其实很多工具是有自己的官方吉祥物的,像Lttngsystemtap等等。但是由于我想保证整个T恤风格的统一,所以决定都使用pony作为原型。),所以我试探性地向Deirdré Straughan女士发邮件,表达了希望可以使用这些吉祥物来设计T恤的想法。没想到Deirdré Straughan很快回了邮件,不仅表示可以免费使用这些图案,而且还提供了一些质量很高的插图。于是我就利用了一个周末的时间,设计好了这件T恤的原始图案,发给了DreamLab团队。经过DreamLab团队的一个星期的辛勤工作,T恤终于于今天上线了!

这款T恤的定价是66元,个人觉得是一个“良心价”。除去所有成本(生产,物流,客户支持等等),其实一件T恤的利润已经很低了。目前想到的收入用途主要有两个:
(1)负责为Deirdré Straughan女士邮寄T恤的快递费;
(2)Deirdré Straughan女士不会从T恤中收取一分钱,她希望如果可能的话,把收入的一部分捐给General Zoi,也就是她用来设计吉祥物的网站。

最后自我推销一下吧:“如果你是一个*nix geek,可以考虑购买这一款T恤,穿上它也许可以让你显得与众不同!

白色T