go语言基础语法

发布于:2024-05-17 ⋅ 阅读:(140) ⋅ 点赞:(0)

基本语法

下面是关于常量、变量、变量类型和运算符的介绍:

常量

在 Go 中,常量使用 const 关键字定义。常量的值在编译时确定,不能被修改。示例如下:

package main

import "fmt"

const Pi = 3.14

func main() {
    fmt.Println("π 的值是", Pi)
}

变量

在 Go 中,变量使用 var 关键字声明。变量可以是任何类型,包括基本类型和复合类型。示例如下:

package main

import "fmt"

func main() {
    var x int
    x = 10
    fmt.Println("x 的值是", x)
}

变量类型

简单变量类型

Go 中的简单变量类型包括整数、浮点数、布尔值、字符串等。

package main

import "fmt"

func main() {
    var i int = 10
    var f float64 = 3.14
    var b bool = true
    var s string = "Hello, Go!"
    
    fmt.Println(i, f, b, s)
}

下面是 Go 中的简单变量类型以及它们的字节长度:

类型 描述 字节长度
int 整数类型 与平台相关
int8 有符号 8 位整数 1
int16 有符号 16 位整数 2
int32 有符号 32 位整数 4
int64 有符号 64 位整数 8
uint 无符号整数 与平台相关
uint8 无符号 8 位整数 1
uint16 无符号 16 位整数 2
uint32 无符号 32 位整数 4
uint64 无符号 64 位整数 8
uintptr 用于指针的无符号整数 与平台相关
float32 单精度浮点数 4
float64 双精度浮点数 8
bool 布尔值 1
string 字符串 与字符串长度相关

注意:

  • intuintuintptr 的字节长度取决于运行程序的平台(32 位或 64 位)。
  • string 类型的字节长度取决于字符串的长度,而不是固定的。

复合变量类型

Go 中的复合变量类型包括数组、切片、字典、结构体等。

package main

import "fmt"

func main() {
    var arr [3]int = [3]int{1, 2, 3}
    var slice []int = []int{4, 5, 6}
    var m map[string]int = map[string]int{"a": 1, "b": 2}
    
    fmt.Println(arr, slice, m)
}

下面是关于 Go 中复合变量类型的介绍

数组(Array)
  • 数组是具有固定长度的相同类型元素的集合。在声明数组时,需要指定数组的长度和元素类型。
  • 示例
    var arr [5]int 表示声明一个包含 5 个整数的数组。
切片(Slice)
  • 切片是对数组的抽象,它提供了动态大小的、灵活的视图。
  • 切片不需要指定固定长度,在使用时可以动态增加或缩减。
  • 示例
    var slice []int 表示声明一个整数类型的切片。
字典(Map)
  • 字典是一种无序的键值对集合,其中每个键对应一个值。
  • 在声明字典时,需要指定键和值的类型。
  • 示例
    var m map[string]int 表示声明一个键为字符串、值为整数的字典。
结构体(Struct)
  • 结构体是一种复合数据类型,它可以包含零个或多个不同类型的字段。

  • 在声明结构体时,需要指定字段的名称和类型。

  • 示例

    type Person struct {
        Name string
        Age  int
    }
    

这些复合变量类型在 Go 语言中非常常用,可以帮助我们更灵活地组织和管理数据。

运算符

逻辑运算符

逻辑运算符用于处理布尔值,包括 &&(与)、||(或)、!(非)等。

package main

import "fmt"

func main() {
    a := true
    b := false
    
    fmt.Println("a && b =", a && b)
    fmt.Println("a || b =", a || b)
    fmt.Println("!a =", !a)
}

算术运算符

算术运算符用于处理数值,包括 +(加)、-(减)、*(乘)、/(除)、%(取模)等。

package main

import "fmt"

func main() {
    a := 10
    b := 3
    
    fmt.Println("a + b =", a + b)
    fmt.Println("a - b =", a - b)
    fmt.Println("a * b =", a * b)
    fmt.Println("a / b =", a / b)
    fmt.Println("a % b =", a % b)
}

位运算符

位运算符用于处理整数的二进制位,包括 &(按位与)、|(按位或)、^(按位异或)、<<(左移)、>>(右移)等。

package main

import "fmt"

func main() {
    a := 5    // 二进制为 101
    b := 3    // 二进制为 011
    
    fmt.Println("a & b =", a & b)   // 二进制为 001,即 1
    fmt.Println("a | b =", a | b)   // 二进制为 111,即 7
    fmt.Println("a ^ b =", a ^ b)   // 二进制为 110,即 6
    fmt.Println("a << 1 =", a << 1) // 二进制为 1010,即 10
    fmt.Println("b >> 1 =", b >> 1) // 二进制为 001,即 1
}

三目运算符

Go 中没有三目运算符(例如 condition ? trueValue : falseValue),但可以使用 if 来实现相同的效果。

package main

import "fmt"

func main() {
    a := 10
    b := 5
    
    var max int
    if a > b {
        max = a
    } else {
        max = b
    }
    fmt.Println("最大值是", max)
}

变量的定义和初始化

在 Go 中,变量的定义和初始化可以分为两步进行,定义变量和给变量赋初值。

变量的定义

变量的定义使用关键字 var,语法格式为

var 变量名 变量类型

例如

var x int

变量的初始化

变量的初始化是在定义变量的同时给它赋初值。初始化使用赋值操作符 =,语法格式为

var 变量名 变量类型 = 初值

例如

var x int = 10

也可以在定义变量时省略类型,由 Go 编译器自动推断变量的类型

var x = 10

如果初始化时不指定变量类型,Go 编译器会根据初值的类型自动推断变量类型。这种方式称为类型推断。

var x = "Hello"

在 Go 中,还可以使用短变量声明方式来定义并初始化变量。短变量声明使用 := 操作符,语法格式为

变量名 := 初值

例如

x := 10

这种方式同样可以让编译器自动推断变量的类型。

我们来总结一下,变量的定义和初始化可以通过 var 关键字或者短变量声明来实现。

条件语句

Go 语言中的条件语句包括 ifelse ifelse。示例如下:

package main

import "fmt"

func main() {
    x := 10

    if x > 5 {
        fmt.Println("x 大于 5")
    } else if x == 5 {
        fmt.Println("x 等于 5")
    } else {
        fmt.Println("x 小于 5")
    }
}

循环语句

Go 语言中的循环语句有 for 循环。示例如下:

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}

函数

在 Go 中,函数使用 func 关键字定义。示例如下:

package main

import "fmt"

func add(x, y int) int {
    return x + y
}

func main() {
    result := add(3, 5)
    fmt.Println("3 + 5 =", result)
}

面向对象

Go 语言支持面向对象编程,通过结构体和方法来实现。示例如下:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func (p Person) SayHello() {
    fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}

func main() {
    p := Person{Name: "Alice", Age: 30}
    p.SayHello()
}

在 Go 中,包是代码组织的基本单元。可以使用 import 关键字引入其他包。示例如下:

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println("π 的值是", math.Pi)
}

组织一个大型项目的包结构是一个非常重要的任务,它能够影响到项目的可维护性、可扩展性和代码的清晰度。以下是一些组织大型项目包结构的常见实践

按功能组织

  • 将代码按照功能模块进行划分,每个功能模块对应一个包。
  • 例如,一个电子商务网站可以有订单模块、用户模块、商品模块等,每个模块对应一个包。

按层次组织

  • 将代码按照层次结构进行组织,常见的层次包括业务逻辑层、数据访问层、接口层等。
  • 例如,一个 Web 应用可以有控制器层、服务层、数据访问层等,每个层次对应一个包。

按照依赖关系组织

  • 将代码按照依赖关系进行组织,确保低层次的模块不依赖于高层次的模块。
  • 例如,将通用的工具函数放在一个包中,其他模块依赖于这个包,而不是相互依赖。

避免循环依赖

  • 避免包之间出现循环依赖,这会导致编译错误或者运行时错误。
  • 在设计包结构时,注意包之间的依赖关系,确保没有循环依赖的情况出现。

使用子包

  • 可以在一个包内部使用子包来组织相关的代码。
  • 例如,一个大型项目的公共工具函数可以放在一个 utils 包内部,然后根据功能再进一步划分子包。

保持包的一致性和简洁性

  • 保持包的一致性,命名规范、代码风格、接口设计等应保持一致,方便团队协作和代码维护。
  • 避免一个包中包含过多的文件和功能,应该保持包的简洁性,每个包应该只专注于一个特定的功能或领域。

一个良好的包结构能够使得代码更易于理解、维护和扩展,提高项目的开发效率和质量。在设计包结构时,需要根据项目的特点和需求进行合理的组织和划分。


网站公告

今日签到

点亮在社区的每一天
去签到