Go 语言是一种编译型语言,源代码都会编译成二进制机器码。
所有 Go 源文件都应该放置在工作区里的 src 目录下。Linux 的工作区(Workspace)应该设置在 $HOME/go,也可以通过设置 GOPATH 环境变量,用其他目录来作为工作区。
1 | go |
第一个 Go 程序
1 | package main |
解析:
package main
- 每一个 Go 文件都应该在开头进行 package name 的声明(译注:只有可执行程序的包名应当为 main)。包(Packages)用于代码的封装与重用,这里的包名称是 main。
import "fmt"
- 我们引入了 fmt 包,用于在 main 函数里面打印文本到标准输出。
func main()
- main 是一个特殊的函数。整个程序就是从 main 函数开始运行的。main 函数必须放置在 main 包中。
fmt.Println("Hello World")
- fmt 包中的 Println 函数用于把文本写入标准输出。
变量 指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。
声明单个变量:var name type,例如:var age int
声明变量并初始化:var name type = initialValue
类型推断:如果变量有初始值,那么 Go 能够自动推断具有初始值的变量的类型。因此,如果变量有初始值,就可以在变量声明中省略 type, 如 var age = 16 指 age 类型为 int 型。
声明多个变量:var name1, name2 type = initialValue1, initialValue2
在一个语句中声明不同类型的变量,如:
1 | var ( |
:=
操作符,例如:age, name := 20, "zhangsan"
。简短声明要求 :=
操作符左边:所有变量都要进行初始化且至少存在一个未声明过的变量。1 | func main() { |
变量也可以在运行时进行赋值,如 a := math.Min(15, 20)
由于 Go 是强类型(Strongly Typed)语言,因此不允许某一类型的变量赋值为其他类型的值。
1 | func main() { |
1 | bool |
%T
格式说明符(Format Specifier)打印出变量的类型。Go 的 unsafe
包提供了一个 Sizeof
函数,该函数接收变量并返回它的字节大小。1 | fmt.Printf("type of age is %T, size of age is %d", age, unsafe.Sizeof(age)) |
complex64
表示实部和虚部都是 float32
类型,complex128
表示实部和虚部都是 float64
类型。1 | c1 := complex(5, 7) // 通过内置函数声明复数变量 c1 |
其它变量类型:byte
是 uint8
的别名, rune
是 int32
的别名。
Go 是强类型(Strongly Typed)语言, Go 没有自动类型提升或类型转换:
1 | var i, j int, float = 5, 10.2 |
关键字:const
,常量不能再重新赋值为其他的值。
常量的值会在 编译的时候 确定。因为函数调用发生在 运行时,所以不能将函数的返回值赋值给常量。如:
1 | var a := math.Sqrt(4) // 允许 |
常量是可以没有类型的,如:const name = "zhangsan"
;常量也可以是有类型的,如:const name string = "lisi"
,即 name 是一个 string 类型的 常量。
Go 的类型策略不允许将一种类型的变量赋值给另一种类型的变量。
1 | func main() { |
var name = "Sam"
无类型的 常量 Sam 是如何赋值给 变量 name 的?
答案是 无类型的常量有一个与它们相关联的默认类型,并且当且仅当一行代码需要时才提供它(即常量可以赋值给「合适的」类型,而不需要类型转换)。
在声明变量时,如果使用常量来赋值,则 变量会从常量的默认类型中获取类型。在这种情况下,常量 “Sam” 的默认类型是字符串,所以变量 name 的类型也是字符串。
学习链接:https://studygolang.com/subject/2,感谢如此优秀的教程!