基础语法
标记
Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。如以下 GO 语句由 6 个标记组成:
fmt.Println("Hello, World!")
6 个标记是(每行一个):
1. fmt
2. .
3. Println
4. (
5. "Hello, World!"
6. )
行分隔符
在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。
以下为两个语句:
fmt.Println("Hello, World!")
fmt.Println("ovim.cloud")
注释
注释不会被编译,每一个包应该有相关注释。
单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。
多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾。如:
// 这是单行注释
/*
这是多行注释
*/
标识符
标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(A~Z和a~z)数字(0~9)、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。
以下是有效的标识符:
mahesh kumar abc move_name a_123
myname50 _temp j a23b9 retVal
以下是无效的标识符:
1ab(以数字开头)case(Go 语言的关键字)a+b(运算符是不允许的)
字符串连接
Go 语言的字符串可以通过 + 实现:
package main
import "fmt"
func main() {
fmt.Println("Google" + "Ovim")
}
以上实例输出结果为:GoogleOvim
关键字
| 25 个关键字或保留字 | ||||
|---|---|---|---|---|
| package | import | func | defer | go |
| goto | struct | var | const | map |
| chan | interface | select | switch | case |
| continue | break | default | if | else |
| return | for | fallthrough | range | type |
| 36个与定义标识符 | |||||
|---|---|---|---|---|---|
| nil | cap | imag | len | iota | real |
| panic | println | new | make | append | |
| copy | recover | close | bool | true | false |
| byte | string | uintptr | float32 | float64 | int |
| int8 | int16 | int32 | uint | uint8 | uint16 |
| uint32 | int64 | uint64 | complex | complex64 | complex128 |
程序一般由关键字、常量、变量、运算符、类型和函数组成
程序中可能会使用到这些分隔符:括号 (),中括号 [] 和大括号 {}
程序中可能会使用到这些标点符号:.、,、;、: 和 …
空格
Go 语言中变量的声明必须使用空格隔开,如:
var age int;
语句中适当使用空格能让程序更易阅读。
无空格:
fruit=apples+oranges;
在变量与运算符间加入空格,程序看起来更加美观,如:
fruit = apples + oranges;
格式化字符串
Go 语言中使用 fmt.Sprintf 格式化字符串并赋值给新串:
package main
import (
"fmt"
)
func main() {
// %d 表示整型数字,%s 表示字符串
var stockcode=123
var enddate="2020-12-31"
var url="Code=%d&endDate=%s"
var target_url=fmt.Sprintf(url,stockcode,enddate)
fmt.Println(target_url)
}
输出结果为:Code=123&endDate=2020-12-31
fmt.Sprintf
Go 可以使用 fmt.Sprintf 来格式化字符串,格式如下:
fmt.Sprintf(格式化样式, 参数列表…)
- 格式化样式:字符串形式,格式化符号以
%开头,%s字符串格式,%d十进制的整数格式。 - 参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。
package main
import (
"fmt"
"io"
"os"
)
func main() {
// go 中格式化字符串并赋值给新串,使用 fmt.Sprintf
// %s 表示字符串
var stockcode="000987"
var enddate="2020-12-31"
var url="Code=%s&endDate=%s"
var target_url=fmt.Sprintf(url,stockcode,enddate)
fmt.Println(target_url)
// 另外一个实例,%d 表示整型
const name, age = "Kim", 22
s := fmt.Sprintf("%s is %d years old.\n", name, age)
io.WriteString(os.Stdout, s) // 简单起见,忽略一些错误
}
输出结果为:
Code=000987&endDate=2020-12-31
Kim is 22 years old.
Go 字符串格式化符号列表:
| 格式 | 描述 |
|---|---|
| %v | 按值的本来值输出 |
| %+v | 在 %v 基础上,对结构体字段名和值进行展开 |
| %#v | 输出 Go 语言语法格式的值 |
| %T | 输出 Go 语言语法格式的类型和值 |
| %% | 输出 % 本体 |
| %b | 整型以二进制方式显示 |
| %o | 整型以八进制方式显示 |
| %d | 整型以十进制方式显示 |
| %x | 整型以十六进制方式显示 |
| %X | 整型以十六进制、字母大写方式显示 |
| %U | Unicode 字符 |
| %f | 浮点数 |
| %p | 指针,十六进制方式显示 |
实例
package main
import (
"fmt"
"os"
)
type point struct {
x, y int
}
func main() {
p := point{1, 2}
fmt.Printf("%v\n", p)
// {1 2}
fmt.Printf("%+v\n", p)
// {x:1 y:2}
fmt.Printf("%#v\n", p)
// main.point{x:1, y:2}
fmt.Printf("%T\n", p)
// main.point
fmt.Printf("%t\n", true)
// true
fmt.Printf("%d\n", 123)
// 123
fmt.Printf("%b\n", 14)
// 1110
fmt.Printf("%c\n", 33)
// !
fmt.Printf("%x\n", 456)
// 1c8
fmt.Printf("%f\n", 78.9)
// 78.900000
fmt.Printf("%e\n", 123400000.0)
// 1.234000e+08
fmt.Printf("%E\n", 123400000.0)
// 1.234000E+08
fmt.Printf("%s\n", "\"string\"")
// "string"
fmt.Printf("%q\n", "\"string\"")
// "\"string\""
fmt.Printf("%x\n", "hex this")
// 6865782074686973
fmt.Printf("%p\n", &p)
// 0xc0000b4010
fmt.Printf("|%6d|%6d|\n", 12, 345)
// | 12| 345|
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)
// |1.20 |3.45 |
fmt.Printf("|%6s|%6s|\n", "foo", "b")
// | foo| b|
fmt.Printf("|%-6s|%-6s|\n", "foo", "b")
// |foo |b |
s := fmt.Sprintf("a %s", "string")
fmt.Println(s)
// a string
fmt.Fprintf(os.Stderr, "an %s\n", "error")
// an error
}