欢迎访问个人 博客和 github!
go 语言学习笔记第一弹,来自 gotour ,之后要常写笔记,把本身学习笔记记录下来,就算只是笔记也要多写。java
好记性不如烂笔头,也要多锻炼本身的写做能力。python
说实话,今天很累了,最近在折腾操做系统内核,由于原先写了个bootloader,如今想要转向 grub 来,遇到坑太多了,已经两天了😭。git
仍是接触一点新知识简单的东西,来缓冲一下,脑子迷迷糊糊的。github
每一个Go程序由不少包组成。golang
程序都是从 main 包开始运行。app
该程序正在使用导入路径为“ fmt”和“ math / rand”的软件包。函数
按照约定,程序包名称与导入路径的最后一个元素相同。学习
例如,“ math / rand”包包括以语句包rand开头的文件。ui
此代码将导入分组为带括号的“分解的”导入语句。操作系统
您还能够编写多个导入语句,例如:
package main import ( "fmt" "math" ) func main() { fmt.Println(math.Pi) }
可是使用分解式import语句是一种很好的样式。
在Go中,若是名称以大写字母开头,则导出该名称。
例如,Pizza是一个导出的名称,Pi也是,它是从math包导出的。
pizza和pi不以大写字母开头,因此它们不被导出。
在导入包时,您只能引用它导出的名称。任何“未导出”的名称都不能从包外部访问。
package main import ( "fmt" "math" ) func main() { fmt.Println(math.Pi) }
一个函数能够接受零个或多个参数。
在此示例中,add接受两个类型为int的参数。
请注意,类型位于变量名称以后。
package main import "fmt" func add(x int, y int) int { return x + y } func mins(x int, y int) int { return x - y; } func main() { fmt.Println(add(42, 13)) fmt.Println(mins(23, 11)) }
当两个或多个连续的命名函数参数共享一个类型时,能够从除最后一个以外的全部其余参数中省略该类型。
在这个例子中,咱们缩短了
x int,y int
至
x,y int
package main import "fmt" func add(x, y int) int { return x + y } func main() { fmt.Println(add(42, 13)) }
一个函数能返回多个返回值。
package main import "fmt" func swap(a, b string) (string, string) { return b, a } func main() { a, b := swap("ai", "ni") fmt.Println(a, b) }
Go的返回值可能会被命名。
若是是,则将它们视为定义在函数顶部的变量。
应该使用这些名称来记录返回值的含义。
没有参数的return语句返回指定的返回值。
这就是所谓的“naked” return。
裸返回语句应该只在短函数中使用,以下面的示例所示。
在较长的函数中,它们可能会损害可读性。
package main import "fmt" func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum - x return } func main() { fmt.Println(split(17)) }
var语句声明了一个变量列表;在函数参数列表中,类型是最后一个。
var语句能够是包级的,也能够是函数级的。在这个例子中咱们能够看到二者。
package main import "fmt" var c, python, java bool func main() { var i int fmt.Println(i, c, python, java) }
var声明能够包含初始化器,每一个变量一个。
若是有初始化,类型能够省略;该变量将采用初始化器的类型。
package main import "fmt" var i, j int = 1, 2 func main() { var c, python, java = true, false, "no!" fmt.Println(i, j, c, python, java) }
在函数内部,可使用:= short赋值语句来代替具备隐式类型的var声明。
在函数以外,每一个语句都以一个关键字(var、func等)开头,所以:=结构不可用
package main import "fmt" func main() { var i, j int = 1, 2 k := 3 c, python, java := true, false, "no!" fmt.Println(a ,i, j, k, c, python, java) }
go 语言的基本数据类型
bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // alias for uint8 rune // alias for int32 // represents a Unicode code point float32 float64 complex64 complex128
该示例显示了几种类型的变量,而且与import语句同样,变量声明也能够“分解”为块。
int,uint和uintptr类型一般在32位系统上为32位宽,在64位系统上为64位宽。
当您须要整数值时,应该使用int,除非有特殊缘由要使用大小或无符号整数类型。
package main import ( "fmt" "math/cmplx" ) var ( ToBe bool = false MaxInt uint64 = 1<<64 - 1 z complex128 = cmplx.Sqrt(-5 + 12i) ) func main() { fmt.Printf("Type: %T Value: %v\n", ToBe, ToBe) fmt.Printf("Type: %T Value: %v\n", MaxInt, MaxInt) fmt.Printf("Type: %T Value: %v\n", z, z) }
声明时没有明确的初始值的变量将被赋予零值。
零值为:
数字类型为0,
对于布尔类型为false
“”(空字符串)表示字符串。
package main import "fmt" func main() { var i int var f float64 var b bool var s string fmt.Printf("%v %v %v %q\n", i, f, b, s) }
使用 T(v) 将 v 值转换为 T 类型
一些例子:
package main import "fmt" func main() { v := 12.2 // change me! fmt.Printf("v is of type %T\n", v) }
与C语言不一样,在Go语言中,不一样类型的项目之间的分配须要显式转换。
在声明变量而不指定显式类型时(使用:=语法或var =表达式语法),将从右侧的值推断出变量的类型。
键入声明的右侧时,新变量具备相同的类型:
var i int j:= i // j是一个整数
可是,当右侧包含无类型的数字常量时,新变量多是int,float64或complex128,具体取决于常量的精度:
i:= 42 //整数 f:= 3.142 // float64 g:= 0.867 + 0.5i //complex128
package main import "fmt" func main() { v := 12.2 // change me! fmt.Printf("v is of type %T\n", v) }
常量像变量同样声明,可是使用const关键字。
常量能够是字符,字符串,布尔值或数字值。
不能使用:=语法声明常量。
package main import "fmt" const Pi = 3.14 func main() { const World = "世界" fmt.Println("Hello", World) fmt.Println("Happy", Pi, "Day") const Truth = true fmt.Println("Go rules?", Truth) }
数字常数是高精度值。
未说明类型的常量采用其上下文所需的类型。
(一个int最多能够存储一个64位整数,有时更少。)
package main import "fmt" const ( // 1 左移 100 位 Big = 1 << 100 // 右移 99 位 Small = Big >> 99 ) func needInt(x int) int { return x*10 + 1 } func needFloat(x float64) float64 { return x * 0.1 } func main() { fmt.Println(needInt(Small)) fmt.Println(needFloat(Small)) fmt.Println(needFloat(Big)) }
欢迎访问个人 博客和 github!