1. Hello World
Go 语言结构非常简单,通常包括 package,导入的包以及 main 函数,在main函数里面写代码。
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
第二行导入了标准库里面的FMT包。这个包主要是用来往屏幕输入输出字符串、格式化字符串。import下面是main 函数, main 函数的话里面调用了fmt.Println输出HelloWorld 要运行这个程序的话,我们就直接go run main.go。如果我们想编译成二进制的话,可以在go buld 来编译。编译完成之后直接./main就可以运行。在FMT包里面还有很多的函数来做不同的输入输出格式化工作。大家可以在编辑器里面把鼠标悬浮在你的代码上,就可以看到每一个函数的文档。
2.数据类型
go语言是一门强类型语言,每一个变量都有它自己的变量类型。 常见的变量类型包含 字符串,整数,浮点型,布尔型等。 go语言的字符串是内置类型,可以直接通过加号拼接,也能够直接用等于号去比较两个字符串。 在go语言里面,大部分运算符的使用和优先级都和C或者C++类似,这里就不再概述。 go语言里面变量的声明有两种方式,一种是通过var name string = ""这种方式声明变量,另一种是使用变量 冒号 :=等于值
var x int
var y string
x = 10
y = "Hello"
var age int = 25
var pi float64 = 3.14159
var name string = "Alice"
var isActive bool = tru
3. 格 式 描 述
- %v 按值的本来值输出
- %+v 在 %v 基础上,对结构体字段名和值进行展开
- %#v 输出 Go 语言语法格式的值
- %T 输出 Go 语言语法格式的类型和值
- %% 输出 % 本体
- %t true或false
- %b 整型以二进制方式显示(整数)或者是无小数部分,指数为二的幂的科学计数法(浮点数)
- %o 整型以八进制方式显示
- %d 整型以十进制方式显示
- %x 整型以十六进制、字母小写方式显示或者字符串或切片显示,每字节两个字符
- %X 整型以十六进制、字母大写方式显示或者字符串或切片显示,每字节两个字符
- %c 相应Unicode码所表示的字符
- %q 单引号围绕的字符字面值,由Go语言安全的转义(整数)或者是双引号围绕的字符串,由Go语言安全的转义(字符串)
- %U Unicode 字符
- %e 科学计数法
- %E 科学计数法
- %f 浮点数
- %g 根据情况选择%e或%f产生更紧凑的无末尾0的输出
- %G 根据情况选择%E或%f产生更紧凑的无末尾0的输出
- %p 指针,十六进制方式显示
- %s 字符串或切片显示
package main
import (
"fmt"
)
type point struct {
x, y int
}
func main() {
p := point{1, 2}
// {1 2}
fmt.Printf("%v\n", p)
// {x:1 y:2}
fmt.Printf("%+v\n", p)
// main.point{x:1, y:2}
fmt.Printf("%#v\n", p)
// main.point
fmt.Printf("%T\n", p)
// 100%
fmt.Printf("%d%%\n", 100)
// true
fmt.Printf("%t\n", true)
// 123
fmt.Printf("%d\n", 123)
// 1110
fmt.Printf("%b\n", 14)
// 7886928847432581p-49
fmt.Printf("%b\n", 14.01)
// 16
fmt.Printf("%o\n", 14)
// 14
fmt.Printf("%d\n", 14)
// e
fmt.Printf("%x\n", 14)
// E
fmt.Printf("%X\n", 14)
// 616263
fmt.Printf("%x\n", "abc")
// 616263
fmt.Printf("%X\n", "abc")
// c
fmt.Printf("%c\n", 'c')
// 'a'
fmt.Printf("%q\n", 'a')
// "abc"
fmt.Printf("%q\n", "abc")
// U+0061
fmt.Printf("%U\n", 'a')
// 1.234000e+08
fmt.Printf("%e\n", 123400000.0)
// 1.234000E+08
fmt.Printf("%E\n", 123400000.0)
// 78.900000
fmt.Printf("%f\n", 78.9)
// 78.9
fmt.Printf("%g\n", 78.9)
// 78.9
fmt.Printf("%G\n", 78.9)
// 0xc0000160b0
fmt.Printf("%p\n", &p)
// "abc"
fmt.Printf("%s\n", "\"abc\"")
// +的演示
fmt.Printf("%+d\n", 10)
fmt.Printf("%+d\n", -10)
// '我'
fmt.Printf("%q\n", '我')
// "a我们b"
fmt.Printf("%q\n", "a我们b")
// '\u6211'
fmt.Printf("%+q\n", '我')
// "a\u6211\u4eecb"
fmt.Printf("%+q\n", "a我们b")
// -的演示
// 默认右对齐
// | 12| 345|
fmt.Printf("|%6d|%6d|\n", 12, 345)
// | 1.20| 3.45|
fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)
// 加-表示左对齐
// |1.20 |3.45 |
fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)
// 默认右对齐
//| foo| b|
fmt.Printf("|%6s|%6s|\n", "foo", "b")
// 加-表示左对齐
// |foo |b |
fmt.Printf("|%-6s|%-6s|\n", "foo", "b")
// #的演示
// 016
fmt.Printf("%#o\n", 14)
// 0xe
fmt.Printf("%#x\n", 14)
// c0000160b0
fmt.Printf("%#p\n", &p)
}
4. 宽度和精度
宽度是%之后的值,如果没有指定,则使用该值的默认值,精度是跟在宽度之后的值,如果没有指定,也使用要打印的值的默认精度。%9.2f,宽度9,精度2。
| %f | default width,default precision |
|---|---|
| %9f | width 9,default precision |
| %.2f | default width,precision 2 |
| %9.2f | width 9,precision 2 |
| %9.f | width 9,precision 0 |
5.数组和切片
数组是固定长度,可以通过[...]来定义长度 切片是动态数组,可以自动扩展
6.运算符
6.1算术运算符
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 相加 | A + B 输出结果 30 |
| - | 相减 | A - B 输出结果 -10 |
| * | 相乘 | A * B 输出结果 200 |
| / | 相除 | B / A 输出结果 2 |
| % | 求余 | B % A 输出结果 0 |
| ++ | 自增 | A++ 输出结果 11 |
| -- | 自减 | A-- 输出结果 9 |
| 其他运算符请看下节。 |
7. 并发
Go语言内有对并发的支持,常用的有Goroutines,Channels.
Goroutines
Goroutines是轻量级线程,通过go关键字启动
go func() {
fmt.Println("This is running concurrently.")
}()
Channels
Channels是Go传递数据的管道
chaner := make(chan int)
go func() {
chaner <- 42 // 发送数据到管道
}()
value := <-channer // 从管道接收数据
fmt.Println(value) // 输出: 42