# 2.1 你好,Go
在开始编写应用之前,我们先从最基本的程序开始。就像你造房子之前不知道什么是地基一样,编写程序也不知道如何开始。因此,在本节中,我们要学习用最基本的语法让Go程序运行起来。
## 程序
这就像一个传统,在学习大部分语言之前,你先学会如何编写一个可以输出`hello world`的程序。
准备好了吗?Let's Go!
package main
import "fmt"
func main() {
fmt.Printf("Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちはせかい\n")
}
输出如下:
Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちはせかい
## 详解
首先我们要了解一个概念,Go程序是通过`package`来组织的
`package <pkgName>`(在我们的例子中是`package main`)这一行告诉我们当前文件属于哪个包,而包名`main`则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。除了`main`包之外,其它的包最后都会生成`*.a`文件(也就是包文件)并放置在`$GOPATH/pkg/$GOOS_$GOARCH`中(以Mac为例就是`$GOPATH/pkg/darwin_amd64`)。
>每一个可独立运行的Go程序,必定包含一个`package main`,在这个`main`包中必定包含一个入口函数`main`,而这个函数既没有参数,也没有返回值。
为了打印`Hello, world...`,我们调用了一个函数`Printf`,这个函数来自于`fmt`包,所以我们在第三行中导入了系统级别的`fmt`包:`import "fmt"`。
包的概念和Python中的package类似,它们都有一些特别的好处:模块化(能够把你的程序分成多个模块)和可重用性(每个模块都能被其它应用程序反复使用)。我们在这里只是先了解一下包的概念,后面我们将会编写自己的包。
在第五行中,我们通过关键字`func`定义了一个`main`函数,函数体被放在`{}`(大括号)中,就像我们平时写C、C++或Java时一样。
大家可以看到`main`函数是没有任何的参数的,我们接下来就学习如何编写带参数的、返回0个或多个值的函数。
第六行,我们调用了`fmt`包里面定义的函数`Printf`。大家可以看到,这个函数是通过`<pkgName>.<funcName>`的方式调用的,这一点和Python十分相似。
>前面提到过,包名和包所在的文件夹名可以是不同的,此处的`<pkgName>`即为通过`package <pkgName>`声明的包名,而非文件夹名。
最后大家可以看到我们输出的内容里面包含了很多非ASCII码字符。实际上,Go是天生支持UTF-8的,任何字符都可以直接输出,你甚至可以用UTF-8中的任何字符作为标识符。
## 结论
Go使用`package`(和Python的模块类似)来组织代码。`main.main()`函数(这个函数位于主包)是每一个独立的可运行程序的入口点。Go使用UTF-8字符串和标识符(因为UTF-8的发明者也就是Go的发明者),所以它天生支持多语言。
## links
* [目录](<preface.md>)
* 上一节: [Go语言基础](<02.0.md>)
* 下一节: [Go基础](<02.2.md>)
- 目录
- Go环境配置
- Go安装
- GOPATH 与工作空间
- Go 命令
- Go开发工具
- 小结
- Go语言基础
- 你好,Go
- Go基础
- 流程和函数
- struct
- 面向对象
- interface
- 并发
- 小结
- Web基础
- web工作方式
- Go搭建一个简单的web服务
- Go如何使得web工作
- Go的http包详解
- 小结
- 表单
- 处理表单的输入
- 验证表单的输入
- 预防跨站脚本
- 防止多次递交表单
- 处理文件上传
- 小结
- 访问数据库
- database/sql接口
- 使用MySQL数据库
- 使用SQLite数据库
- 使用PostgreSQL数据库
- 使用beedb库进行ORM开发
- NOSQL数据库操作
- 小结
- session和数据存储
- session和cookie
- Go如何使用session
- session存储
- 预防session劫持
- 小结
- 文本文件处理
- XML处理
- JSON处理
- 正则处理
- 模板处理
- 文件操作
- 字符串处理
- 小结
- Web服务
- Socket编程
- WebSocket
- REST
- RPC
- 小结
- 安全与加密
- 预防CSRF攻击
- 确保输入过滤
- 避免XSS攻击
- 避免SQL注入
- 存储密码
- 加密和解密数据
- 小结
- 国际化和本地化
- 设置默认地区
- 本地化资源
- 国际化站点
- 小结
- 错误处理,调试和测试
- 错误处理
- 使用GDB调试
- Go怎么写测试用例
- 小结
- 部署与维护
- 应用日志
- 网站错误处理
- 应用部署
- 备份和恢复
- 小结
- 如何设计一个Web框架
- 项目规划
- 自定义路由器设计
- controller设计
- 日志和配置设计
- 实现博客的增删改
- 小结
- 扩展Web框架
- 静态文件支持
- Session支持
- 表单支持
- 用户认证
- 多语言支持
- pprof支持
- 小结
- 参考资料