快速了解 http://go-tour-zh.appspot.com/welcome/1 (可以需要爬墙)
下面记录下了解go的过程,特别记录下与你脑子里原有“观念”不同的地方:
1. 声名 初始化,类型在后面,不一样
var a, b int var a,b =1,2
var c, python, java = true, false, "no!" a,b:=func fname(string,string) //非声明,必须在func使用
短声明变量
在函数中,`:=` 简洁赋值语句在明确类型的地方,可以用于替代 var
定义。
函数外的每个语法块都必须以关键字开始(`var`、`func`、等等),`:=` 结构不能使用在函数外。
2.函数返回多个值
func swap(x, y string) (string, string) { //x, y string 等价 x sring ,y string
return y, x
}
命名返回值
func swap(string, string) (x, y string) { #返回值分别命名为x,y
x= x+12
y= y+1
return
} // 空return实际返回的是x,y
3.对于声明了但没使用的变量,引入但没有使用的包,会引发错误, go可以自动格式化源码
func 函数体的第一个'{'必须在同一行(?试了不在一行格式不行,运行出错)
4.包
每个 Go 程序都是由包组成的。
程序运行的入口是包 `main`。
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10)) //先不管rand.Intn干什么的,按照惯例,包名与导入路径的最后一个目录一致。例如,`"math/rand"` 包由 package rand
语句开始
}
注意:导出名
在导入了一个包之后,就可以用其导出的名称来调用它。
在 Go 中,首字母大写的名称是被导出的。(算是一种惯例/约定,如python里_function _varname是私有一样)
package main import ( "fmt" "math" ) func main() { fmt.Println(math.pi) }
Foo
和 FOO
都是被导出的名称。名称 foo
是不会被导出的 ,所以math.pi肯定不存在,可能Pi是存在的
5.基本类型
Go 的基本类型有Basic types
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名
// 代表一个Unicode码
float32 float64
complex64 complex128
package main import ( "fmt" "math/cmplx" ) var ( //这样用很特别 ToBe bool = false MaxInt uint64 = 1<<64 - 1 z complex128 = cmplx.Sqrt(-5 + 12i) ) func main() { const f = "%T(%v)\n" fmt.Printf(f, ToBe, ToBe) //bool(false)
fmt.Printf(f, MaxInt, MaxInt) //uint64(18446744073709551615)
fmt.Printf(f, z, z) //complex128((2+3i)) 不懂
}
6.类型转换 不同类型间转换需要显式进行,即使从int往int64转也得显式 (c是可以隐式转换的,溢出不提示)
7.循环只有for ,没有 while ,通过省略for的首尾式可以做到while一样的事 :for i < 10 {}
有疑问加站长微信联系(非本文作者)