GO语言入门 | 青训营

98 阅读7分钟

前言

默认已经下载好goland还有go 1.20。本文基于go1.20进行讲解。

入门

入门肯定离不开hello world!打印了。

首先简单来看看实现hello world代码。

package main
import "fmt"
func main() {
	fmt.Println("Hello, World!")
}
  1. package 声明的是所在目录下的包名
  2. import 导入的相关的库 这里的fmt库主要作用是用于进行控制台的输出的打印
  3. 也是需要声明main函数才可以运行
  4. fmt是调用的包名,点后面跟着其方法。

这种函数编写、调用的方式与大部分语言相似,所以不着重去描述。

变量声明

在 Go 语言中,有多种方式来声明变量。以下是常见的变量声明方式:

  1. 声明并初始化变量:
var name string = "John"
var age int = 25

**

  1. 类型推断:
var name = "John"  // 根据初始化值自动推断变量类型为 string
var age = 25      // 根据初始化值自动推断变量类型为 int

**

  1. 短变量声明(仅在函数内部可用):
name := "John"  // 短变量声明并初始化,自动推断变量类型为 string
age := 25      // 短变量声明并初始化,自动推断变量类型为 int

**

  1. 多个变量同时声明:
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 和 AgeName 是字符串类型,Age 是整数类型。

可以使用结构体字面量来创建结构体变量,也可以使用指针来操作结构体。

  1. 结构体变量的创建和访问:
p := Person{Name: "John", Age: 25}  // 创建 Person 结构体变量
fmt.Println(p.Name)  // 访问结构体字段
fmt.Println(p.Age)

**

  1. 指针操作结构体:
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 函数的声明和调用的基本规则:

  1. 函数声明:
func functionName(parameter1 type1, parameter2 type2, ...) returnType {
    // 函数体
    return result
}

**

  • functionName 是函数的名称。
  • parameter1, parameter2, ... 是函数的参数列表,每个参数都有一个类型。
  • returnType 是函数的返回值类型。
  • 函数体包含了实现函数功能的代码。
  • result 是函数的返回值,使用 return 关键字返回结果。
  1. 函数调用:
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 循环。以下是这些循环的基本用法示例:

  1. for 循环:
for initialization; condition; post {
    // 循环体
}
  1. while 循环(使用 for 来实现):
for condition {
    // 循环体
}
  1. do-while 循环(使用无限循环和 break 来实现):
for {
    // 循环体
    if condition {
        break
    }
}

可以使用 fmt.Println 函数打印输出循环迭代的值。

还可以使用breakcontinue进行循环的控制。

go面向对象特征

  1. 结构体(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()

  1. 方法(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() 调用。

  1. 封装(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 字段可以被访问。

  1. 继承(Inheritance):Go 语言没有传统意义上的继承机制,但可以通过嵌入结构体来实现类似的效果。
type Person struct {
    Name string
}

type Employee struct {
    Person // 嵌入 Person 结构体
    Salary float64
}

在上述示例中,Employee 结构体嵌入了 Person 结构体,这使得 Employee 可以访问 Person 结构体的字段和方法。需要注意的是,Go 语言并不支持传统的多态性(Polymorphism)特性,但可以通过接口实现一定程度的多态性。