这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
基础语法
认识Go
先从输出一个Hello,World开始!
标准输出是fmt.Println()。
main包是程序的入口文件。
package main
import (//引入fmt(format)包(输入输出字符串,格式化字符串)
"fmt"
)
func main() {
fmt.Println("Hello, world")
}
基础语法 - 变量
注意:在go语言中字符类型不是char,而是byte
var可以用来定义任意类型变量,var后面带一个类型是强制某一类型
go中可以简写,用 := 的方式代替var,这样的效果和var一样,定义任意类型变量,只能用在函数内部,全局变量要用var。
const 可以代替var,只能声明一个常量,不可修改。
package main
import (
"fmt"
"math"
)
func main() {
var o byte = "p"
fmt.Println(o)
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f)
fmt.Println(g)
const s string = "constant"
const h = 300000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
基本语法 - 输入输出
如果我们未为一个变量初始化,则必须显式指定变量类型
| %v | %d | %f | %t | %c |
|---|---|---|---|---|
| 按数据原格式 | 十进制整形 | 单精度浮点型(float32) | 布尔型 | 字符型 |
| %s | %T | %o | %x和%X | %e和%E |
|---|---|---|---|---|
| 字符串型 | 变量的数据类型 | 八进制 | 十六进制,前者的字母用大写表示,后者用小写表示 | 科学计数法 |
标准输入是fmt.Scanf()
-
输入整型
fmt.Scanf("%d", &a) fmt.Printf("整型:%d", a)
-
输入浮点型
fmt.Scanf("%f", &b) fmt.Printf("浮点型:%f", b)
-
输入字符串
fmt.Scanf("%s", &str) fmt.Printf("字符串:%s", str)
-
输入布尔类型
fmt.Scanf("%t", &c) fmt.Printf("布尔:%t", c)
-
输入字符类型
fmt.Scanf("%c", &d) fmt.Printf("字符:%c", d)
基础语法 - if else
if不能不用括号,必须要用大括号,else也是,不能和C++一样省略括号, else和else if要紧贴着if结束的括号写,否则会报错。
package main
import (
"fmt"
)
func main() {
if 7 % 2 == 0 {//
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if 8 % 4 == 0 {
fmt.Println("8 is divisible by 4")
}
}
基础语法 - 循环
Go 语言只有for循环,没有C语言中的while和do while循环。
定义一个死循环 for{...}
循环中有变量,不需要写括号。for j := 7; j < 9; j ++ {...}
基础语法 - switch
需要注意的是,与其他语言恰好相反,switch 语句中每个 case 的 break 是隐式存在的,也就是说,每个 case 的逻辑会在执行完毕后立刻退出,而不是跳转到下一个 case。
要想跳转到下一个 case,则应该使用 fallthrough 关键字,需要注意的是,fallthrough 关键字只能存在于 case 的末尾
package main
import (
"fmt"
"time"
)
func main() {
a := 2
switch a {
case 1:
fmt.Println("one")
fallthrough
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t := time.Now()
fmt.Println(t)
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
}
基础语法 - 数组
数组是定长的,用的不多,用的更多的是切片slice,就在下一节有介绍。
定义一个int数组 var a [5]int,同样也能用 := 来定义一个数组,b := [5]int{1, 2, 3, 4, 5};定义一个二维数组 var twoD [2][3]int,用%2d可以格式化输出内容,方便阅读。
基础语法 - 切片
对于make来说,是Go语言之用来分配内存的函数,使用在slice(切片),map(哈希表),chan(通道)这三种数据类型上面。因为这三种数据类型的特殊性,用来分配和初始化这三种数据类型。
切片是可变长度的数组
make(type,length,capacity)创建切片
需要注意的是,切片的 长度(length) 和 容量(capacity) 是两个完全不同的东西,前者才是切片实际的长度,后者则是一个阈值,当切片长度达到该阈值时才会对切片进行扩容。在实际测试当中,有定义的长度的切片能够比无定义长度的切片性能更优,因为已经分配了长度,每次使用不需要先扩容。
切片可以用 append 来往后增加。
定义一个map s := make([]string, 3)
给map增加东西 s = append(s, "d"),还可以增加多个 s = append(s, "e", "f")
map中可以使用切片 fmt.Println(s[2:5])