前言
默认已经下载好goland还有go 1.20。本文基于go1.20进行讲解。
入门
入门肯定离不开hello world!打印了。
首先简单来看看实现hello world代码。
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
- package 声明的是所在目录下的包名
- import 导入的相关的库 这里的fmt库主要作用是用于进行控制台的输出的打印
- 也是需要声明main函数才可以运行
- fmt是调用的包名,点后面跟着其方法。
这种函数编写、调用的方式与大部分语言相似,所以不着重去描述。
变量声明
在 Go 语言中,有多种方式来声明变量。以下是常见的变量声明方式:
- 声明并初始化变量:
var name string = "John"
var age int = 25
**
- 类型推断:
var name = "John" // 根据初始化值自动推断变量类型为 string
var age = 25 // 根据初始化值自动推断变量类型为 int
**
- 短变量声明(仅在函数内部可用):
name := "John" // 短变量声明并初始化,自动推断变量类型为 string
age := 25 // 短变量声明并初始化,自动推断变量类型为 int
**
- 多个变量同时声明:
var a, b, c int // 声明多个 int 类型的变量
var name, age = "John", 25 // 同时声明并初始化多个变量,自动推断类型
**
注意事项:
- 在函数内部,可以使用短变量声明
:=来代替var关键字。 - 使用
var声明的变量必须指定类型,而使用:=或初始化赋值的方式可以通过初始化值自动推断类型。 - 如果变量声明时没有显式初始化,Go 将使用零值进行初始化。例如,
int类型的零值为 0,string类型的零值为空字符串 (“”),bool类型的零值为 false。 - 对于全局变量声明,可以使用
var关键字,也可以使用短变量声明:=(但不能用在函数体外部)。
这和我们的js语言有点相似,go也是一门弱类型的语言。
go的结构体与指针
go是一门融合了c指针的语言,但是其使用指针难度不高,也没有像c和c++这么强大的功能。 在 Go 语言中,结构体(struct)是一种自定义的复合数据类型,它由零个或多个不同类型的字段组成。每个字段都有一个名称和类型。
以下是一个简单的结构体示例:
type Person struct {
Name string
Age int
}
**
上面的代码定义了一个名为 Person 的结构体,它有两个字段:Name 和 Age。Name 是字符串类型,Age 是整数类型。
可以使用结构体字面量来创建结构体变量,也可以使用指针来操作结构体。
- 结构体变量的创建和访问:
p := Person{Name: "John", Age: 25} // 创建 Person 结构体变量
fmt.Println(p.Name) // 访问结构体字段
fmt.Println(p.Age)
**
- 指针操作结构体:
p := &Person{Name: "John", Age: 25} // 创建指向 Person 结构体的指针
p.Name = "Alice" // 通过指针修改结构体字段的值
p.Age = 30
fmt.Println(p.Name) // 访问结构体字段
fmt.Println(p.Age)
**
在上面的示例中,通过使用 & 符号可以创建一个指向结构体的指针。通过指针可以修改结构体字段的值,并访问字段。
使用指针操作结构体可以提高性能,尤其是在传递结构体到函数时,避免了拷贝结构体的开销。此外,指针还可以用于表示结构体对象的空值(nil)。
当需要修改结构体变量的值时,使用指针操作是必需的。但在访问结构体字段时,使用指针操作和直接操作没有本质的区别。
记住,当你使用指针操作结构体的字段时,要确保指针不为空(nil)。
go的函数声明
在 Go 语言中,函数是一种可重复使用的代码块,用于执行特定的任务。以下是关于 Go 函数的声明和调用的基本规则:
- 函数声明:
func functionName(parameter1 type1, parameter2 type2, ...) returnType {
// 函数体
return result
}
**
functionName是函数的名称。parameter1, parameter2, ...是函数的参数列表,每个参数都有一个类型。returnType是函数的返回值类型。- 函数体包含了实现函数功能的代码。
result是函数的返回值,使用return关键字返回结果。
- 函数调用:
result := functionName(argument1, argument2, ...)
**
functionName是要调用的函数的名称。argument1, argument2, ...是传递给函数的实际参数。
以下是一个简单的示例,展示了如何声明和调用一个函数:
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
result := add(10, 20)
fmt.Println(result)
}
在上面的示例中,我们定义了一个名为 add 的函数,它接受两个整数作为参数,并返回它们的和。在 main 函数中,我们调用了 add 函数,并将结果打印出来。
运行上面的程序,将输出30
**
这是因为我们调用了 add(10, 20),得到了 10 和 20 的和 30,并将结果赋给了 result 变量。然后,我们使用 fmt.Println 函数将结果打印出来。
注意事项:
- Go 语言支持多返回值的函数声明和调用。
- 如果函数没有返回值,则返回类型可以省略。
- 没有形参的函数声明中,括号也不能省略。
go的循环
在 Go 语言中,有几种方式可以进行循环操作,包括 for 循环、while 循环和 do-while 循环。以下是这些循环的基本用法示例:
for循环:
for initialization; condition; post {
// 循环体
}
while循环(使用for来实现):
for condition {
// 循环体
}
do-while循环(使用无限循环和break来实现):
for {
// 循环体
if condition {
break
}
}
可以使用 fmt.Println 函数打印输出循环迭代的值。
还可以使用break和continue进行循环的控制。
go面向对象特征
- 结构体(Struct):Go 语言通过结构体来创建自定义的复合数据类型,可以将字段和方法组合到一个结构体中。
type Person struct {
Name string
Age int
}
func (p Person) SayHello() {
fmt.Println("Hello, my name is", p.Name)
}
**
上述示例中的 Person 结构体具有 Name 和 Age 两个字段,还定义了一个方法 SayHello()。
- 方法(Method):Go 语言允许将方法与结构体相关联,通过声明方法来为指定类型添加行为。
func (p Person) SayHello() {
fmt.Println("Hello, my name is", p.Name)
}
func main() {
p := Person{Name: "John", Age: 25}
p.SayHello() // 调用结构体的方法
}
**
在上述示例中,SayHello() 是 Person 结构体的方法,通过 p.SayHello() 调用。
- 封装(Encapsulation):Go 语言使用大写字母开头的字段和方法来实现对外部的封装,以实现数据和行为的隐藏。小写字母开头的字段和方法只能在包内部访问。
type Person struct {
name string // 小写字母开头的字段,只能在包内部访问
age int // 小写字母开头的字段,只能在包内部访问
Address string // 大写字母开头的字段,可以在包外部访问
}
func (p Person) SayHello() {
fmt.Println("Hello, my name is", p.name)
}
**
在上述示例中,name 和 age 字段不能在其他包中直接访问,而 Address 字段可以被访问。
- 继承(Inheritance):Go 语言没有传统意义上的继承机制,但可以通过嵌入结构体来实现类似的效果。
type Person struct {
Name string
}
type Employee struct {
Person // 嵌入 Person 结构体
Salary float64
}
在上述示例中,Employee 结构体嵌入了 Person 结构体,这使得 Employee 可以访问 Person 结构体的字段和方法。需要注意的是,Go 语言并不支持传统的多态性(Polymorphism)特性,但可以通过接口实现一定程度的多态性。