每日新闻

每日新闻

GoCN每日新闻资讯
有问必答

有问必答

Go相关的问题,技术相关的问题
文章分享

文章分享

技术文章分享,让知识传播给更多的人
招聘应聘

招聘应聘

为Gopher服务的招聘应聘平台

使用channel代替条件变量

文章分享astaxie 回复了问题 • 2 人关注 • 1 个回复 • 3341 次浏览 • 2016-10-14 17:25 • 来自相关话题

go是如何分配内存的?

有问必答wayslog 回复了问题 • 6 人关注 • 4 个回复 • 2609 次浏览 • 2016-10-14 16:19 • 来自相关话题

Python 程序员的 Golang 学习指南(III): 入门篇

文章分享Cloudinsight 发表了文章 • 0 个评论 • 2748 次浏览 • 2016-10-14 15:39 • 来自相关话题

Authors: startover * [startover's Github](https://github.com/startover) * [Cloudinsight](http://cloudinsight.oneapm.c ...查看全部
Authors: startover
* [startover's Github](https://github.com/startover)
* [Cloudinsight](http://cloudinsight.oneapm.com/?utm_source=CiTechBlog&utm_medium=gocn&utm_term=pythongolang3&utm_campaign=CiTech&from=jscwgyegna) 工程师

------------


## 基础语法

#### 类型和关键字

* 类型

```
// 基础类型
布尔类型: bool
整型: int8,uint8,int16,uint16,int32,uint32,int64,uint64,int,rune,byte,complex128, complex64,其中,byte 是 int8 的别名
浮点类型: float32 、 float64
复数类型: complex64 、 complex128
字符串: string
字符类型: rune(int32的别名)
错误类型: error

// 复合类型
指针(pointer)
数组(array)
切片(slice)
字典(map)
通道(chan)
结构体(struct)
接口(interface)
```

* 关键字

```
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

```

#### 变量

Go 同其他语言不同的地方在于变量的类型在变量名的后面,不是 `int a`,而是 `a int`。至于为什么这么定义,Go 的[官方博客](https://blog.golang.org/gos-declaration-syntax)有给出解释,有兴趣的可以参考下。

变量定义语法如下:

```go
var a int
a = 2

// 或者
a := 2

// 同时定义多个变量
var (
a int
b bool
)

// 同时给多个变量赋值
a, b := 2, true
```

#### 操作符

```
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^=

```

#### 控制结构

Go 语言支持如下的几种流程控制语句:

* 条件语句,对应的关键字为 if、else 和 else if;
* 选择语句,对应的关键字为 switch、case 和 select;
* 循环语句,对应的关键字为 for 和 range;
* 跳转语句,对应的关键字为 goto。

值得一提的是,Go 语言并不支持 do 或者 while 关键字,而是对 for 关键字做了增强,以实现类似的效果,如下:

```go
for {
// 实现无限循环,慎用!
}
```

#### 常用内置函数

* len:计算(字符串,数组或者切片,map)长度
* cap:计算(数组或者切片,map)容量
* close:关闭通道
* append:追加内容到切片
* copy:拷贝数组/切片内容到另一个数组/切片
* delete:用于删除 map 的元素

#### array, slice 和 map

```go
// array
a := [3]int{ 1, 2, 3 } // 等价于 a := [...]int{ 1, 2, 3 }

// slice
s := make([]int , 3) // 创建一个长度为 3 的 slice
s := append(s, 1) // 向 slice 追加元素
s := append(s, 2)

// map
m := make(map[string]int) // 使用前必须先初始化
m["golang"] = 7
```

关于 array, slice 和 map 的更多惯用法,有一篇[文章](https://se77en.cc/2014/06/30/array-slice-map-and-set-in-golang/)介绍的挺详细,有兴趣的可以看看。

#### 函数

Go 语言的函数有如下特性:

* 不定参数

由于 Go 语言不支持函数重载(具体原因见 [Go Language FAQ](https://golang.org/doc/faq#overloading)),但我们可以通过不定参数实现类似的效果。

```go
func myfunc(args ...int) {
// TODO
}

// 可通过如下方式调用
myfunc(2)
myfunc(1, 3, 5)
```

* 多返回值

与 C、C++ 和 Java 等开发语言的一个极大不同在于,Go 语言的函数或者成员的方法可以有多
个返回值,这个特性能够使我们写出比其他语言更优雅、更简洁的代码。

```go
func (file *File) Read(b []byte) (n int, err error)

// 我们可以通过下划线(_)来忽略某个返回值
n, _ := f.Read(buf)
```

* 匿名函数

匿名函数是指不需要定义函数名的一种函数实现方式,它并不是一个新概念,最早可以回溯
到 1958 年的 Lisp 语言。但是由于各种原因,C 和 C++ 一直都没有对匿名函数给以支持,其他的各
种语言,比如 JavaScript、C# 和 Objective-C 等语言都提供了匿名函数特性,当然也包含Go语言。

匿名函数由一个不带函数名的函数声明和函数体组成,如下:

```go
func(a, b int) bool {
return a < b
}
```

匿名函数可以直接赋值给一个变量或者直接执行:

```go
f := func(a, b int) bool {
return a < b
}

func(a, b int) bool {
return a < b
}(3, 4) // 花括号后直接跟参数列表表示函数调用
```

* 闭包

闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者
任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块(由于自由变量包含
在代码块中,所以这些自由变量以及它们引用的对象没有被释放)为自由变量提供绑定的计算环
境(作用域)。

Go 的匿名函数就是一个闭包。我们来看一个例子:

```go
package main

import "fmt"

func main() {
j := 5
a := func() func() {
i := 10
return func() {
fmt.Printf("i, j: %d, %d\n", i, j)
}
}()
a()
j *= 2
a()
}
```

程序输出如下:

```
i, j: 10, 5
i, j: 10, 10
```

#### 错误处理

Go 语言追求简洁优雅,所以,Go 语言不支持传统的 `try...catch...finally` 这种异常,因为 Go 语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在 Go 语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比如除数为0了),才使用 Go 中引入的Exception处理:defer, panic, recover。

用法如下:

```go
package main

import "fmt"

func main() {
defer func() {
fmt.Println("recovered:", recover())
}()
panic("not good")
}
```

关于 Go 语言的错误处理机制和传统的 `try...catch...finally` 异常机制孰优孰劣,属于仁者见仁,智者见智,这里不做赘速。有兴趣的同学可以去看看知乎上的讨论:[Go 语言的错误处理机制是一个优秀的设计吗?](https://www.zhihu.com/question/27158146)。


## 面向对象 -> 一切皆类型

Python 推崇“一切皆对象”,而在 Go 语言中,类型才是一等公民。

我们可以这样定义一个结构体:

```go
type Name struct {
First string
Middle string
Last string
}
```

同样也可以定义基础类型:

```go
type SimpleName string
```

还能给任意类型定义方法:

```go
func (s SimpleName) String() string { return string(s) }
// 或者
func (s string) NoWay()
```


## Golang VS Python

最后我们通过几个例子来比较一下 Golang 与 Python 的一些基本用法,如下:

#### 生成器(Generator)

* Python 版本

```python
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
yield a

for x in fib(10):
print x

print 'done'
```

* Golang 版本

```go
package main

import "fmt"

func fib(n int) chan int {
c := make(chan int)
go func() {
a, b := 0, 1
for i := 0; i < n; i++ {
a, b = b, a+b
c <- a
}
close(c)
}()
return c
}

func main() {
for x := range fib(10) {
fmt.Println(x)
}
}
```

#### 装饰器(Decorator)

* Python 版本

```python
from urlparse import urlparse, parse_qs
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

def auth_required(myfunc):
def checkuser(self):
user = parse_qs(urlparse(self.path).query).get('user')
if user:
self.user = user[0]
myfunc(self)
else:
self.wfile.write('unknown user')
return checkuser

class myHandler(BaseHTTPRequestHandler):
@auth_required
def do_GET(self):
self.wfile.write('Hello, %s!' % self.user)

if __name__ == '__main__':
try:
server = HTTPServer(('localhost', 8080), myHandler)
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
```

* Golang 版本

```go
package main

import (
"fmt"
"net/http"
)

var hiHandler = authRequired(
func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi, %v", r.FormValue("user"))
},
)

func authRequired(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if r.FormValue("user") == "" {
http.Error(w, "unknown user", http.StatusForbidden)
return
}
f(w, r)
}
}

func main() {
http.HandleFunc("/hi", hiHandler)
http.ListenAndServe(":8080", nil)
}
```

#### 猴子补丁(Monkey patching)

* Python 版本

```python
import urllib

def say_hi(usr):
if auth(usr):
print 'Hi, %s' % usr
else:
print 'unknown user %s' % usr

def auth(usr):
try:
auth_url = 'localhost'
r = urllib.urlopen(auth_url + '/' + usr)
return r.getcode() == 200
except:
return False

def sayhitest():
# Test authenticated user
globals()['auth'] = lambda x: True
say_hi('John')

# Test unauthenticated user
globals()['auth'] = lambda x: False
say_hi('John')

if __name__ == '__main__':
sayhitest()
```

* Golang 版本

```go
package main

import (
"fmt"
"net/http"
)

func sayHi(user string) {
if !auth(user) {
fmt.Printf("unknown user %v\n", user)
return
}
fmt.Printf("Hi, %v\n", user)
}

var auth = func(user string) bool {
authURL := "localhost"
res, err := http.Get(authURL + "/" + user)
return err == nil && res.StatusCode == http.StatusOK
}

func testSayHi() {
auth = func(string) bool { return true }
sayHi("John")

auth = func(string) bool { return false }
sayHi("John")
}

func main() {
testSayHi()
}
```


相关链接:
[https://blog.golang.org/gos-declaration-syntax](https://blog.golang.org/gos-declaration-syntax)
[https://se77en.cc/2014/06/30/array-slice-map-and-set-in-golang/](https://se77en.cc/2014/06/30/array-slice-map-and-set-in-golang/)
[https://golang.org/doc/faq#overloading](https://golang.org/doc/faq#overloading)
[https://www.zhihu.com/question/27158146](https://www.zhihu.com/question/27158146)
[https://talks.golang.org/2013/go4python.slide](https://talks.golang.org/2013/go4python.slide)


------------

本文章为 [Cloudinsight](http://cloudinsight.oneapm.com/?utm_source=CiTechBlog&utm_medium=gocn&utm_term=pythongolang1&utm_campaign=CiTech&from=jscwgyegna) 技术团队工程师原创,更多技术文章可访问 [Cloudinsight 技术博客](http://cloudinsight.oneapm.com/blog/?utm_source=CiTechBlog&utm_medium=gocn&utm_term=pythongolang1&utm_campaign=CiTech&from=jscwgyegna)。[Cloudinsight](http://cloudinsight.oneapm.com/?utm_source=CiTechBlog&utm_medium=gocn&utm_term=pythongolang1&utm_campaign=CiTech&from=jscwgyegna) 为可视化系统监控工具,涵盖 Windows、Linux 操作系统,用 Golang 开发的 Cloudinsight Agent 正式开源了,欢迎 fork,Github:https://github.com/cloudinsight/cloudinsight-agent


golang-for-pythonistas 系列持续更新中,欢迎关注,及时获取最新文章~

Go里面有没有重写和重载这么一说?

有问必答philc 回复了问题 • 7 人关注 • 4 个回复 • 8138 次浏览 • 2016-10-14 14:02 • 来自相关话题

我想使用hugo,该如何入门?

文章分享itfanr 发表了文章 • 3 个评论 • 2384 次浏览 • 2016-10-14 13:54 • 来自相关话题

- [使用Hugo搭建静态站点](http://tonybai.com/2015/09/23/intro-of-gohugo/ "使用Hugo搭建静态站点") - [Hugo静态网站生成不完全教程](http://isunxu.xyz ...查看全部
- [使用Hugo搭建静态站点](http://tonybai.com/2015/09/23/intro-of-gohugo/ "使用Hugo搭建静态站点")

- [Hugo静态网站生成不完全教程](http://isunxu.xyz/cs/make-personal-website-by-hugo/ "Hugo静态网站生成不完全教程")

【兼职】有没有想接私活程序猿,看过来!

招聘应聘erbajie 回复了问题 • 3 人关注 • 3 个回复 • 2727 次浏览 • 2016-10-14 13:46 • 来自相关话题

BTCC<Bitcoin+Blockchain> Hiring Golanger

招聘应聘Paul_Peng 发表了文章 • 8 个评论 • 1265 次浏览 • 2016-10-14 13:33 • 来自相关话题

# WHO WE ARE: BTCC was originally founded as BTCChina in 2011. It is the longest-running and one of the largest Bitcoin exch ...查看全部
# WHO WE ARE:
BTCC was originally founded as BTCChina in 2011. It is the longest-running and one of the largest Bitcoin exchanges worldwide. BTCC plays a leading role in every segment of the bitcoin ecosystem, offering a digital currency exchange, a mining pool, payment processing, consumer wallets, and blockchain engraving. The diverse products and services BTCC offers allow its customers to engage in all aspects of the digital currency spectrum in one integrated platform. Headquartered in Shanghai, BTCC serves a global customer base and has become an industry leader for security, risk mitigation, credibility, and technological innovation. Its mission is to provide the world with the most convenient and trustworthy digital currency services.

# WHAT WE ARE LOOKING FOR:
We are looking for a talented, experienced, and motivated Software Engineer to help us launch our next generation BTCC products and services. You will be a part of a high-performance organization that is changing the future of finance with blockchain technologies.

In this role you will be working with the team ’ s passionate developers to take our existing platform to the next level. You must be ready to step into a fast-paced team environment, working with cutting edge technologies.

# WHAT WE OFFER:
Rare opportunity to work in one of the most cutting edge and fastest growing industries.
Lively Western-style work environment with passionate and energetic colleagues coming from diverse backgrounds.
Competitive salary.
Quarterly bonus paid in Bitcoins.
Company events and parties several times a year.
Stock options plan for selected candidates.

Email Address:jobs@btcc.com WeChat:13764246315

大家是如何处理 golang web 应用静态资源的?

技术讨论astaxie 回复了问题 • 5 人关注 • 1 个回复 • 4798 次浏览 • 2016-10-14 13:08 • 来自相关话题

glide如何获取包的所有依赖?

有问必答astaxie 回复了问题 • 3 人关注 • 1 个回复 • 3676 次浏览 • 2016-10-14 13:07 • 来自相关话题

Rikka - 极简多插件私人图床

开源程序7sDream 发表了文章 • 3 个评论 • 3145 次浏览 • 2016-10-14 12:23 • 来自相关话题

OvO 终于有个 Go 社区了……我来发个学 Golang 的时候练手的一个东西吧…… ## 简介 Rikka 是一个极简的图床系统,设计理念是让每个人都能有个自己的好用的图床。为了极简,去掉了上传历史的功能 ...查看全部
OvO 终于有个 Go 社区了……我来发个学 Golang 的时候练手的一个东西吧……

## 简介

Rikka 是一个极简的图床系统,设计理念是让每个人都能有个自己的好用的图床。为了极简,去掉了上传历史的功能,所有的一切都按照 `上传-复制-关闭-粘贴` 的使用流程来设计。为了方便每个人自己部署,封装成了 Docker Image。DaoCloud 的一个 128M 的实例都能愉快的跑 Rikka,内存占用大约 10 - 20M。

因为是在我刚学 Go 的时候开的项目,所以我在有意的尽量不使用其他模块,专注于用自带 package 完成功能,对于其他初学者可能是个不错的例子哟。

## 特点/Feature:

- 极简,不保存上传历史
- 支持将图片链接复制成多种格式
- 文件储存部分插件化,有很多可用的插件,比如:新浪微博,七牛云,又拍云,腾讯云等
- 提供 API
- Web 服务和 RESTful API 服务模块化
- CLI 工具
- 只保证支持较新版本的 Chrome/Firefox/Safari
- 首页标志很可爱
- 维护者貌似很活跃 :)

## 目前支持的图片储存插件

- 本地服务器
- 七牛云
- 又拍云
- 新浪微博
- 腾讯云 COS
- 腾讯云 CI

可能以后还会加啦,因为是插件形式,所以加起来很简单。应该以后会有 Imgur 和 Flickr 插件吧。
恩,其实可以自己写插件的,但是我现在还没写插件的编写文档。不过把目前我写的几个插件看完应该也就明白怎么写了,很 Easy 的~

## 截图/Demo

首页:

![homepage](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-498160687)

预览页面:

![viewpage](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-457359417)

我在 DaoCloud 用免费配额搭了个 Rikka 做 Demo:http://7sdream-rikka-demo.daoapp.io/

密码是:`rikka`

感兴趣的可以去试试,最大图片大小 5M。不过这只是 Demo 哟,不要真的用这个啦,如果想自己搭个自用的 Rikka 的话可以看:[部署文档](https://github.com/7sDream/rikka/blob/master/deploy.zh.md)和[图文教程](https://github.com/7sDream/rikka/wiki/%E5%9C%A8-DaoCloud-%E4%B8%8A%E5%85%8D%E8%B4%B9%E9%83%A8%E7%BD%B2-Rikka)

我自己也在腾讯云部署了一个:http://akkir.me 但是这个就不告诉你们密码咯……毕竟是自用的。

## API/CLI

Rikka 是有 RESTFul 的 API 的,文档在[这里](https://github.com/7sDream/rikka/blob/master/api/README.zh.md)。

然后我还写了个 CLI 工具方便命令行使用:[文档](https://github.com/7sDream/rikka/blob/master/rikkac/README.zh.md)|[下载](https://github.com/7sDream/rikka/releases/tag/Rikkac)。

放个使用截图吧:

![](http://7sdream-rikka-demo.daoapp.io/files/2016-09-05-066558195)

然后是多张上传:

![](http://odbw8jckg.bkt.clouddn.com/ba2d2dca-2ae2-4436-ade2-7905183ce23d.png)

计划中是有跨平台 GUI 想法的,不过现在还没动手。

## 项目地址

嘎嘎嘎 项目地址留在最后:https://github.com/7sDream/rikka

Docker Image:https://hub.docker.com/r/7sdream/rikka/

如果刚开始学 Golang 的小伙伴应该可以稍微看看当作入门例子。

功力雄厚的同志们就来多提提意见吧~不甚感激!

对了对了,有谁知道 Docker Container 的 Logs 怎么和 Fail2Ban 结合起来使用呀?只能在 Container 里装个 Fail2Ban 么?

exec.Command执行出错: exit status 64

技术讨论limard 回复了问题 • 3 人关注 • 2 个回复 • 2510 次浏览 • 2016-10-14 11:53 • 来自相关话题

wego,我们游戏使用的屏蔽字服务

Go开源项目goofansu 发表了文章 • 2 个评论 • 1382 次浏览 • 2016-10-14 11:33 • 来自相关话题

# 前言 感谢@astaxie在v2ex发布了这个帖子 https://www.v2ex.com/t/312653, 之前我在V站也发过wego的帖子,但是没什么响应,就希望找到专门讨论Go的社区,帮助自己提高写代码的水平。 ...查看全部
# 前言

感谢@astaxie在v2ex发布了这个帖子 https://www.v2ex.com/t/312653, 之前我在V站也发过wego的帖子,但是没什么响应,就希望找到专门讨论Go的社区,帮助自己提高写代码的水平。

# wego介绍

项目页面:https://github.com/repong/wego

最近游戏要上线了,为了迎接版署审核,开发了一下屏蔽字的服务,我之前的主语言不是Go,最近写了一个月,感觉用Go写工具很方便,特别是编译和部署,一个binary搞定。

有兴趣的同学可以看看 [README](https://github.com/repong/wego/blob/master/README.md)

# 使用方法

``` bash
$ ./wego -port 1234
Loading dict...
载入sego词典 /var/folders/yy/ksdhbgf551bgg_5p0dkyd5kr0000gn/T/chinese_dictionary.txt844575244
载入sego词典 /var/folders/yy/ksdhbgf551bgg_5p0dkyd5kr0000gn/T/english_dictionary.txt811498491
sego词典载入完毕
Version : 1.0.0-5-g8c1e0b9
Git Hash : 8c1e0b943ea21f72e4eca8adc7a931ebb287da8f
Build Time : 2016-10-14T07:45:22Z
[GIN] 2016/10/14 - 15:45:46 | 200 | 148.311µs | 127.0.0.1 | POST /filter
[GIN] 2016/10/14 - 15:46:18 | 200 | 93.437µs | 127.0.0.1 | POST /validate
```

# http请求

``` bash
curl -XPOST http://localhost:1234/validate -d "message=测试封杀"
{"result":"false"}

curl -XPOST http://localhost:1234/filter -d "message=测试封杀"
{"result":"测试**"}
```

关于交叉编译的错误: no buildable Go source files in $GOPATH/src/github.com/zeromq/goczmq

有问必答sheepbao 回复了问题 • 2 人关注 • 2 个回复 • 4545 次浏览 • 2016-10-14 11:31 • 来自相关话题

提交一个社区的bug

站点反馈astaxie 回复了问题 • 2 人关注 • 1 个回复 • 1749 次浏览 • 2016-10-14 11:28 • 来自相关话题

go的移动端编译器有吗

技术讨论myml 回复了问题 • 3 人关注 • 2 个回复 • 1794 次浏览 • 2016-10-14 10:34 • 来自相关话题