Skip to main content

基础语法

标记

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 个关键字或保留字
packageimportfuncdefergo
gotostructvarconstmap
chaninterfaceselectswitchcase
continuebreakdefaultifelse
returnforfallthroughrangetype
36个与定义标识符
nilcapimagleniotareal
panicprintprintlnnewmakeappend
copyrecoverclosebooltruefalse
bytestringuintptrfloat32float64int
int8int16int32uintuint8uint16
uint32int64uint64complexcomplex64complex128

程序一般由关键字、常量、变量、运算符、类型和函数组成

程序中可能会使用到这些分隔符:括号 (),中括号 [] 和大括号 {}

程序中可能会使用到这些标点符号:.、,、;、: 和 …

空格

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整型以十六进制、字母大写方式显示
%UUnicode 字符
%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
}