mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 05:11:49 +08:00
clean
This commit is contained in:
@@ -91,7 +91,7 @@ Go 语言一个非常好的目标就是实现所谓的复杂事件处理([CEP]
|
|||||||
|
|
||||||
如果你想知道一些其它组织使用Go语言开发的实际应用项目,你可以到这个页面进行查看:[http://go-lang.cat-v.org/organizations-using-go](http://go-lang.cat-v.org/organizations-using-go)。出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。我们将会在第 21 章讨论到一个使用 Go 语言开发的大型存储区域网络(SAN)案例。
|
如果你想知道一些其它组织使用Go语言开发的实际应用项目,你可以到这个页面进行查看:[http://go-lang.cat-v.org/organizations-using-go](http://go-lang.cat-v.org/organizations-using-go)。出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。我们将会在第 21 章讨论到一个使用 Go 语言开发的大型存储区域网络(SAN)案例。
|
||||||
|
|
||||||
在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl( ***为什么我觉得这是"钠"?*** )),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。
|
在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl( ***译者注:为什么我觉得这是"氯化钠"?*** )),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。
|
||||||
|
|
||||||
Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如 Nexus 系列的产品。
|
Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如 Nexus 系列的产品。
|
||||||
|
|
||||||
|
129
eBook/04.4.md
129
eBook/04.4.md
@@ -1,129 +0,0 @@
|
|||||||
##啊哦,亲,你看得也太快了。。。还没翻译完呢 0 0
|
|
||||||
要不等到 ***2013 年 4 月 23 日*** 再来看看吧~~
|
|
||||||
|
|
||||||
这里还有一些其它的学习资源噢~
|
|
||||||
|
|
||||||
- [《Go编程基础》](https://github.com/Unknwon/go-fundamental-programming):已更新至 [第9课](https://github.com/Unknwon/go-fundamental-programming/blob/master/lecture9/lecture9.md)
|
|
||||||
- [《Go Web编程》](https://github.com/astaxie/build-web-application-with-golang)
|
|
||||||
|
|
||||||
神马?你说你不想学习?那好吧,去逛逛论坛看看行情也行~
|
|
||||||
|
|
||||||
- [Golang中文社区](http://bbs.mygolang.com/forum.php)
|
|
||||||
- [Go语言学习园地](http://studygolang.com/)
|
|
||||||
- [Golang中国](http://golang.tc)
|
|
||||||
|
|
||||||
#4.4 变量
|
|
||||||
#4.4.1 简介
|
|
||||||
声明变量的一般形式是使用 `var` 关键字:`var identifier type`。
|
|
||||||
|
|
||||||
需要注意的是,Go 和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后。Go 为什么要选择这么做呢?
|
|
||||||
|
|
||||||
首先,它是为了避免像 C 语言中那样含糊不清的声明形式,例如:`int* a, b;`。在这个例子中,只有 a 是指针而 b 不是。如果你想要这两个变量都是指针,则需要将它们分开书写(你可以在该页面找到有关于这个话题的更多讨论:[http://blog.golang.org/2010/07/gos-declaration-syntax.html](http://blog.golang.org/2010/07/gos-declaration-syntax.html))。
|
|
||||||
|
|
||||||
而在 Go 中,则可以和轻松地将它们都声明为指针类型:`var a, b *int`。
|
|
||||||
|
|
||||||
其次,这种语法能够按照从左至右的顺序阅读,使得代码更加容易理解。
|
|
||||||
|
|
||||||
示例:
|
|
||||||
|
|
||||||
var a int
|
|
||||||
var b bool
|
|
||||||
var str string
|
|
||||||
|
|
||||||
你也可以改写成这种形式:
|
|
||||||
|
|
||||||
var (
|
|
||||||
a int
|
|
||||||
b bool
|
|
||||||
str string
|
|
||||||
)
|
|
||||||
|
|
||||||
这种因式分解关键字的写法一般用于声明全局变量。
|
|
||||||
|
|
||||||
当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,flost 为 0.0,bool 为 false,string 为空字符串,指针为 nil。记住,所有的内存在 Go 中都是经过初始化的。
|
|
||||||
|
|
||||||
变量的命名规则遵循骆驼命名法,即首个单词小写,每个新单词的首字母大写,例如:`numShips`, `startDate`。
|
|
||||||
|
|
||||||
但如果你的全局变量希望能够被外部包所使用,则需要将首个单词的首字母也大写(第 4.2 节:可见性规则)。
|
|
||||||
|
|
||||||
一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。如果一个变量在函数体外声明,则被认为是全局变量,可以在整个包甚至外部包(被导出后)使用,不管你声明在哪个源文件里或在哪个源文件里调用该变量。
|
|
||||||
|
|
||||||
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。在第 5 章,我们将会学习到像 if 和 for 这些控制结构,而在这些结构中声明的变量的作用域只在相应的代码块内。一般情况下,局部变量的作用域可以通过代码块(用大括号括起来的部分)判断。
|
|
||||||
|
|
||||||
尽管变量的标识符必须是唯一的,但你可以在某个代码块的内层代码块中使用相同名称的变量,则此时外部的同名变量将会暂时隐藏(结束内部代码块的执行后隐藏的外部同名变量又会出现,而内部同名变量则被释放),你任何的操作都只会影响内部代码块的局部变量。
|
|
||||||
|
|
||||||
变量可以编译期间就被赋值,赋值给变量使用运算符等号 `=`,当然你也可以在运行时对变量进行赋值操作。
|
|
||||||
|
|
||||||
示例:
|
|
||||||
|
|
||||||
a = 15
|
|
||||||
b = false
|
|
||||||
|
|
||||||
一般情况下,只有类型相同的变量之间才可以相互赋值,例如:`a = b`。
|
|
||||||
|
|
||||||
声明与赋值(初始化)语句也可以组合起来。
|
|
||||||
|
|
||||||
示例:
|
|
||||||
|
|
||||||
var identifier [type] = value
|
|
||||||
var a int = 15
|
|
||||||
var i = 5
|
|
||||||
var b bool = false
|
|
||||||
var str string = “Go says hello to the world!”
|
|
||||||
|
|
||||||
但是 Go 编译器的智商已经高到可以根据变量的值来自动推断其类型,这有点像 Ruby 和 Python 这类动态语言,只不过它们是在运行时进行推断,而 Go 是在编译时就已经完成推断过程。因此,你还可以使用下面的这些形式来声明及初始化变量:
|
|
||||||
|
|
||||||
var a = 15
|
|
||||||
var b = false
|
|
||||||
var str = “Go says hello to the world!”
|
|
||||||
|
|
||||||
或:
|
|
||||||
|
|
||||||
var (
|
|
||||||
a = 15
|
|
||||||
b = false
|
|
||||||
str = “Go says hello to the world!”
|
|
||||||
numShips = 50
|
|
||||||
city string
|
|
||||||
)
|
|
||||||
|
|
||||||
不过自动推断类型并不是任何时候都适用的,当你想要给变量的类型并不是自动推断出的某种类型时,你还是需要显式指定变量的类型,例如:`var n int64 = 2`。
|
|
||||||
|
|
||||||
然而,`var a` 这种语法是不正确的,因为编译器没有任何可以用于自动推断类型的依据。变量的类型也可以在运行时实现自动推断,例如:
|
|
||||||
|
|
||||||
var (
|
|
||||||
HOME = os.Getenv(“HOME”)
|
|
||||||
USER = os.Getenv(“USER”)
|
|
||||||
GOROOT = os.Getenv(“GOROOT”)
|
|
||||||
)
|
|
||||||
|
|
||||||
这种写法主要用于声明包级别的全局变量,当你在函数体内声明局部变量时,应使用简短声明语法 `:=`,例如:`a := 1`。
|
|
||||||
|
|
||||||
下面这个例子展示了如何在运行时获取所在的操作系统类型,它通过 `os` 包中的函数 `os.Getenv()` 来获取环境变量中的值,并保存到 string 类型的局部变量 `path` 中。
|
|
||||||
|
|
||||||
Example 4.5 [goos.go](examples/chapter_4/goos.go)
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
“fmt”
|
|
||||||
“os”
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var goos string = os.Getenv(“GOOS”)
|
|
||||||
fmt.Printf(“The operating system is: %s\n”, goos)
|
|
||||||
path := os.Getenv(“PATH”)
|
|
||||||
fmt.Printf(“Path is %s\n”, path)
|
|
||||||
}
|
|
||||||
|
|
||||||
如果你在 Windows 下运行这段代码,则会输出 `The operating system is: windows` 以及相应的环境变量的值;如果你在 Linux 下运行这段代码,则会输出 `The operating system is: linux` 以及相应的的环境变量的值。
|
|
||||||
|
|
||||||
这里用到了 `Printf` 的格式化输出的功能(第 4.4.3 节)。
|
|
||||||
|
|
||||||
#4.4.2 值类型和引用类型
|
|
||||||
|
|
||||||
##链接
|
|
||||||
- [目录](directory.md)
|
|
||||||
- 上一节:[常量](04.3.md)
|
|
||||||
- 下一节:[基本类型和运算符](04.5.md)
|
|
Reference in New Issue
Block a user