Skip to content

基础语法和数据类型

基础语法

注释

注释是在编程代码中用于添加解释性文本的一种方式。它们是为了给程序员提供额外的信息,解释代码的功能、目的、实现细节或其他相关信息,在 Go 语言支持两种类型的注释:单行注释、多行注释。

以下是单行注释案例:

go
// 这是单行注释

以下是多行注释案例:

go
/*
这里是多行注释
Go语言又称为Golang
Go语言由Google公司开发的一种编程语言
*/

推荐使用单行注释来替代多行注释

以下是在开源项目的注释案例。

go
// getAvgPowerBudget retrieves configured power budget
// (in watts) for NVM devices. When libipmctl is not available
// zero is returned.
func getAvgPowerBudget() (uint, error) {
	// Get number of devices on the platform
	// see: https://github.com/intel/ipmctl/blob/v01.00.00.3497/src/os/nvm_api/nvm_management.h#L1478
	count := C.uint(0)
	err := C.nvm_get_number_of_devices(&count)
	if err != C.NVM_SUCCESS {
		klog.Warningf("Unable to get number of NVM devices. Status code: %d", err)
		return uint(0), fmt.Errorf("Unable to get number of NVM devices. Status code: %d", err)
	}

	if count == 0 {
		klog.V(4).Infof("There are no NVM devices.")
		return uint(0), nil
	}

	// Load basic device information for all the devices
	// to obtain UID of the first one.
	devices := make([]C.struct_device_discovery, count)
	err = C.nvm_get_devices(&devices[0], C.uchar(count))
	if err != C.NVM_SUCCESS {
		klog.Warningf("Unable to get all NVM devices. Status code: %d", err)
		return uint(0), fmt.Errorf("Unable to get all NVM devices. Status code: %d", err)
	}

	// Power budget is same for all the devices
	// so we can rely on any of them.
	device := C.struct_device_details{}
	err = C.nvm_get_device_details(&devices[0].uid[0], &device)
	if err != C.NVM_SUCCESS {
		uid := C.GoString(&devices[0].uid[0])
		klog.Warningf("Unable to get details of NVM device %q. Status code: %d", uid, err)
		return uint(0), fmt.Errorf("Unable to get details of NVM device %q. Status code: %d", uid, err)
	}

	return uint(device.avg_power_budget / 1000), nil
}

标识符

在 Go 语言中,标识符是用来命名变量、函数、类型、常量和其他程序实体的名称。标识符用于在代码中引用这些实体,并且在编程过程中需要遵循一些规则。

详细介绍在包的管理和常用规范

以下是有效的标识符:

go
name ikun  age  abc  b_7788
myblog77  _temp  j  a88n99  retValue

以下的是无效标识符:

go
// 以数字开头的标识符
123abc
9var
// 包含特殊字符的标识符
my-var
my@var
// 使用了保留关键字作为标识符
if
func
for
// 重复的标识符
func myFunc() {
    var myVar int
    var myVar string // 重复的标识符
}

关键字

下面列举了 Go 代码中会使用到的 25 个关键字或保留字:

12345
breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

在使用 Go 语言的关键字时,有一些注意事项需要牢记:

  • 关键字不能用作标识符:Go 语言的关键字具有特殊含义,不能用作变量名、函数名或其他标识符。例如,不能将关键字 if 用作变量名。
  • 关键字的大小写:Go 语言的关键字是严格区分大小写的。例如,if 是关键字,而 If 或 IF 不是。
  • 保留关键字:虽然某些单词可能在当前版本的 Go 中不是关键字,但它们可能在将来的版本中成为关键字。因此,应避免使用这些保留关键字作为标识符。

除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符:

12345
常量: truefalseiotanil
类型: intint8int16int32int64
uintuint8uint16uint32uint64
uintptrfloat32float64complex128complex64
boolbyterunestringerror
函数: makelencapnewappend
copyclosedeletecomplexreal
imagpanicrecover

在使用 Go 语言的预定义标识符时,有一些注意事项需要记住:

  • 保留标识符:预定义标识符具有特殊的含义和行为,它们在标准库中有定义。因此,不应该重新定义这些标识符作为变量名或函数名,以免引起混淆并降低代码的可读性。
  • 标识符的大小写:Go 语言是大小写敏感的,因此你必须按照预定义标识符的大小写来使用它们。例如,true 和 True 是不同的标识符。
  • 类型安全:预定义标识符具有特定的类型,例如 bool 是布尔类型,int 是整数类型。在使用这些标识符时,要注意与其对应的类型一致,以确保类型安全性。
  • 功能和语义:预定义标识符具有特定的功能和语义。例如,len 用于获取容器的长度,make 用于创建切片、映射和通道等。在使用这些标识符时,要理解其用途和作用,以正确地应用它们。
  • 错误处理:预定义标识符 error 用于表示错误类型。在处理错误时,可以使用该标识符来定义和返回错误值,以及进行错误检查和处理。
  • 异常处理:预定义标识符 panic 和 recover 用于处理异常。panic 用于引发异常,而 recover 用于恢复异常并进行处理。在使用这些标识符时,要了解它们的行为和使用方式,以确保正确处理异常情况。

总之,在使用预定义标识符时,要遵循它们的规则和语义,以确保代码的正确性和可读性。熟悉这些标识符的用途和功能将有助于你更好地理解和使用 Go 语言的标准库。

数据类型

Go语言的数据类型分为两大类:基本类型、复合类型(派生类型)。

基本类型

  • 数值类型:
    • 有符号位:int、int8、int16、int32、int64
    • 无符号位:uint、uint8、uint16、uint32、uint64
  • 浮点类型:float32、float64
  • 布尔类型:bool
  • 复数类型:complex64、complex128
  • 字符串:string
  • 字符:byte【uint8】、rune【int32】

复合类型(派生类型)

  • 指针(pointer)
  • 数组(array)
  • 切片(slice)
  • 字典(map)
  • 通道(channel)
  • 结构体(struct)
  • 函数(function)
  • 接口(interface)

接下来详细介绍基本类型,关于复合类型后面的文档再详细说明,就不在基础语法和数据类型该文档详细讲解。

数值类型

类型取值范围占用内存空间大小
uint80 到 2551 字节
uint160 到 655352 字节
uint320 到 42949672954 字节
uint640 到 184467440737095516158 字节
int8-128 到 1271 字节
int16-32768 到 327672 字节
int32-2147483648 到 21474836474 字节
int64-9223372036854775808 到 92233720368547758078 字节

示例代码如下:

go
package main

import "fmt"

func main() {
	// 数值类型
	// 无符号整数
	var n1 uint8 = 255
	var n2 uint16 = 65535
	var n3 uint32 = 4294967295
	var n4 uint64 = 18446744073709551615

	// 有符号整数
	var n5 int8 = -128
	var n6 int16 = -32768
	var n7 int32 = -2147483648
	var n8 int64 = -9223372036854775808

	fmt.Println(n1)
	fmt.Println(n2)
	fmt.Println(n3)
	fmt.Println(n4)
	fmt.Println("============")
	fmt.Println(n5)
	fmt.Println(n6)
	fmt.Println(n7)
	fmt.Println(n8)
}

浮点类型

类型取值范围占用内存空间大小
float321.18e-38 到 3.4e+384 字节
float642.23e-308 到 1.8e+3088 字节

示例代码如下:

go
package main

import "fmt"

func main() {
	// 浮点类型
	// 浮点数
	var f1 float32 = 3.14159265358979
	var f2 float64 = 3.14159265358979323846264338327950288

	fmt.Println(f1)
	fmt.Println(f2)
}

布尔类型

类型取值范围占用内存空间大小
booltrue 或 false1 字节

示例代码如下:

go
package main

import (
	"fmt"
)

func main() {
	// 布尔类型
	var b1 bool = true
	var b2 bool = false

	fmt.Println(b1)
	fmt.Println(b2)
}

复数类型

类型取值范围占用内存空间大小
complex64实部和虚部取值范围同float328 字节
complex128实部和虚部取值范围同float6416 字节

示例代码如下:

go
package main

import "fmt"

func main() {
	// 复数
	var c1 complex64 = 3.14159265358979 + 2.71828182845905i
	var c2 complex128 = 3.14159265358979323846264338327950288 + 2.71828182845904523536028747135266249i

	fmt.Println(c1)
	fmt.Println(c2)
}

字符串类型

类型说明占用内存空间大小
string字符串序列取决于字符串长度,每个字符占2个字节

示例代码如下:

go
package main

import "fmt"

func main() {
    // 字符串类型
    var a string = "Hello, World!"
    fmt.Println(a)
}

字符类型

类型说明取值范围占用内存空间大小
byteuint8 别名0 到 2551字节
runeint32 别名, 用于表示 Unicode 码点-2147483648 到 21474836474字节

示例代码如下:

go
package main

import "fmt"

func main() {
    // 字符
    var a byte = 'A' // 等同于 uint8
    var b rune = '' // 等同于 int32
    fmt.Printf("%c %c\n", a, b)
}

根据 MIT 许可证发布