GO学习
官方文档
Go 编程语言是一个开源项目,旨在提高程序员的工作效率。
Go 富有表现力、简洁、干净且高效。它的并发机制使编写程序变得容易,从而充分利用多核和联网机器,而其新颖的类型系统则支持灵活和模块化的程序构建。Go 可以快速编译为机器代码,同时还具有垃圾收集的便利性和运行时反射的强大功能。它是一种快速、静态类型的编译语言,感觉就像是一种动态类型的解释语言。
基础
导入导出
1. 多次单组导入,分组导入。 2.导出:大写字母-已导出的。 导入一个包,只能使用已导出的名字
多次单组导入
import "fmt"
import "math"
分组导入 使用分组导入语句是更好的形式
import (
"fmt"
"math"
)
函数
2. 函数返回:多值返回,单值返回,命名返回
func split(sum int) (x int) {
x = sum * 4 / 9
y = sum - x
return
}
变量
3. 变量
var 语句可以出现在包或函数级别
package main
import "fmt"
var i, j int = 1, 2
func main() {
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
变量的初始化: 变量声明可以包含初始值,每个变量对应一个。 如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型。
var i, j int = 1, 2
短变量声明
在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。
函数外的每个语句都必须以关键字开始(var, func 等等),因此 := 结构不能在函数外使用
基本类型
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名
// 表示一个 Unicode 码点
float32 float64
complex64 complex128
int, uint 和 uintptr 在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽。 当你需要一个整数值时应使用 int类型,除非你有特殊的理由使用固定大小或无符号的整数类型。
在Go语言(Golang)中,整数类型用来表示整数,主要包括int系列和uint系列。这两大系列根据能否表示负数,分为有符号整数和无符号整数。
- int系列(有符号整数): int8: 占用1个字节(8位),能够表示的有符号整数范围从-128到127。 int16: 占用2个字节(16位),能够表示的有符号整数范围从-32768到32767。 int32: 占用4个字节(32位),能够表示的有符号整数范围从-2147483648到2147483647。 int64: 占用8个字节(64位),能够表示的有符号整数范围从-9223372036854775808到9223372036854775807。 int: 在32位系统中,int通常等同于int32,在64位系统中,int通常等同于int64。
它的大小取决于系统的位数。
- uint系列(无符号整数): uint8: 占用1个字节(8位),能够表示的无符号整数范围从0到255。 uint16: 占用2个字节(16位),能够表示的无符号整数范围从0到65535。 uint32: 占用4个字节(32位),能够表示的无符号整数范围从0到4294967295。 uint64: 占用8个字节(64位),能够表示的无符号整数范围从0到18446744073709551615。 uint: 和int类似,uint的大小也取决于系统的位数,在32位系统中通常等同于uint32,在64位系统中通常等同于uint64。 总结来说,这些整数类型的区别主要在于它们能够表示的数值的范围和所占用的存储空间大小。选择合适的整数类型对于确保程序的正确性、优化性能和避免溢出错误都是很重要的。在实际编程中,应根据实际需要选择最合适的整数类型。
原文链接:blog.csdn.net/qq_42533216…
4. 零值
在 Go 语言中,零值(Zero Value)是指在声明变量但没有显式赋值的情况下,变量会被自动赋予一个默认值。这个默认值取决于变量的类型,不同类型的变量会有不同的零值。零值是 Go 语言中的一个重要概念,因为它确保了变量在声明后具有一个可预测的初始状态,减少了未初始化变量引发的问题。 以下是一些常见类型的零值和关于零值的详细信息:
1. 整数类型
- 对于有符号整数(
int、int8、int16、int32、int64),零值为0。 - 对于无符号整数(
uint、uint8、uint16、uint32、uint64),零值也为0。
2. 浮点数类型
- 对于浮点数类型(
float32和float64),零值为0.0。
3. 布尔类型
- 对于布尔类型(
bool),零值为false。
4. 字符串类型
- 对于字符串类型(
string),零值为空字符串""。
5. 数组类型
- 对于数组类型,每个元素的零值是其类型的零值。例如,
[3]int数组的零值是[0, 0, 0]。
6. 切片类型
- 对于切片类型(
[]T,其中T是任何类型),切片的零值是nil,表示一个未分配底层数组的切片。长度和容量都为0。
7. 映射类型
- 对于映射类型(
map[T]U,其中T和U是任何类型),映射的零值是nil,表示一个未分配内部数据结构的映射。
8. 通道类型
- 对于通道类型(
chan T,其中T是任何类型),通道的零值是nil,表示一个未初始化的通道。
9. 结构体类型
- 对于结构体类型(
struct),结构体的零值是将其所有字段都设置为其类型的零值。
10. 指针类型
- 对于指针类型(
*T,其中T是任何类型),指针的零值是nil,表示一个未初始化的指针。 - 请注意,在使用指针时要小心空指针(nil pointer)的情况,即指针没有指向任何有效的内存地址。在解引用指针之前,应先确保该指针不为 nil。
&用于获取变量的地址,*用于解引用指针并获取指针指向的值。指针在 Go 中被广泛使用,用于共享和修改变量的值,并在函数之间传递大型数据结构。blog.csdn.net/qq_37508131…
11. 接口类型
- 对于接口类型(
interface{}),接口的零值是nil,表示一个未实现任何方法的接口。
零值在 Go 语言中是一种有用的特性,因为它确保了变量在声明后处于可预测的初始状态,而不会包含随机或未知的值。这有助于避免潜在的错误和增加代码的可读性。
要注意的是,零值只在声明变量但未显式初始化时才会生效。如果你显式初始化一个变量,那么它将采用你提供的值而不是零值。例如:
var x int // 零值为 0
var y int = 42 // 显式初始化为 42
了解 Go 中不同类型的零值是编写可靠和清晰代码的重要一部分。零值确保了变量的可预测初始状态,减少了未初始化变量引发的问题。
12. nil与零值
nil 和零值(Zero Value)并不完全相同,尽管它们在某些情况下可能有相似的效果,但它们代表了不同的概念。
-
nil:
nil是一个特殊的值,通常用于表示指针、切片、映射、通道和接口等数据结构的未初始化状态。- 对于指针、切片、映射、通道和接口,
nil表示这些数据结构没有分配底层资源或没有被初始化。 nil不是一个有效的值,它不能用于表示具体的数据或有效的对象。- 当对一个
nil数据结构执行操作时,通常会引发运行时错误,例如尝试在nil切片上进行索引操作或在nil映射上执行读取操作。
-
零值:
- 零值是指在声明变量但未显式赋值时,变量会自动被赋予一个默认值。
- 不同类型的变量具有不同的零值,例如整数的零值是
0,字符串的零值是空字符串""。 - 零值确保了变量在声明后处于可预测的初始状态,而不会包含随机或未知的值。
尽管在某些情况下 nil 和零值可能表现得相似,例如 nil 切片和零值切片都表示空切片,但它们的含义不同。nil 表示未初始化或无效状态,而零值表示具有特定数据类型的默认值。因此,在实际编程中,需要根据上下文和数据类型来确定是使用 nil 还是零值。
nil 和零值是 Go 语言中的两个不同的概念,分别用于表示未初始化状态和默认值。了解它们的区别有助于编写清晰、可读性强的代码。
备注:关联对象的零值直接nil
类型
类型转换
与 C 不同的是,Go 在不同类型的项之间赋值时需要显式转换
类型推导
在声明一个变量而不指定其类型时(即使用不带类型的 := 语法或 var = 表达式语法),变量的类型由右值推导得出。
当右值声明了类型时,新变量的类型与其相同:
var i int
j := i // j 也是一个 int
不过当右边包含未指明类型的数值常量时,新变量的类型就可能是 int, float64 或 complex128 了,这取决于常量的精度:
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
常量
Go语言是一种静态类型语言,这意味着所有变量的类型在编译时必须明确,并且一旦定义,类型就不能改变。
常量声明
常量的声明与变量类似,只不过是使用 const 关键字。
常量可以是字符、字符串、布尔值或数值。
常量不能用 := 语法声明。
const Pi = 3.14