Golang – 基础入门

文章目录

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言。

一、Hello World

Golang源文件的扩展是.go,这些文件名均由小写字母组成,如hello.go

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

要执行Golang代码可以使用go run命令,打包生成二进制文件可以使用go build命令。

$ go run hello.go 
Hello, World!

二、包

  1. 每个Go程序都由包构成,可以使用自身的包或者从其它包中导入内容,在Go的安装文件里包含了一些可以直接使用的包,即标准库
  2. package定义包名,程序从main包开始运行,如果包名为main,即package main表示一个可独立执行的程序,每个Go应用程序都包含一个名为main的包。

如果需要多个包,它们可以被分别导入:

import "fmt"
import "os"

或更短且更优雅的方法(被称为因式分解关键字,该方法适用于importconstvartype的声明或定义):

import (
   "fmt"
   "os"
)

可以使用包的别名来解决包名之间的名称冲突:

package main

import fm "fmt" // 设置 fmt 包的别名为:fm

func main() {
   fm.Println("hello, world")
}

三、基础语法

  1. Go程序中,一行代表一个语句结束。如果将多个语句写在同一行,它们则必须使用;人为区分,但不推荐。
  2. 单行注释以//开头, 多行注释也叫块注释,均已以/*开头,并以*/结尾。
  3. 标识符由字母``数字``下划线组成,且第一个字符必须是字母下划线而不能是数字
  4. 字符串连接可以通过+实现,如:"hello" + "world"
  5. 使用fmt.Sprintffmt.Printf格式化字符串并赋值给新串。
    • Sprintf根据格式化参数生成格式化的字符串并返回该字符串:fmt.Println(fmt.Sprintf("Code=%d&endDate=%s",stockcode,enddate))输出Code=123&endDate=2024-12-31
    • Printf根据格式化参数生成格式化的字符串并写入标准输出。fmt.Printf("Code=%d&endDate=%s",stockcode,enddate)输出Code=123&endDate=2024-12-31

四、基本数据类型

类型 默认值 描述
布尔型:bool false 布尔型的值只可以是常量true或者false
整型:int8/int16/int32/int64 0 8/16/32/64 位整型
整型:uint8/uint16/uint32/uint64 0 8/16/32/64 位无符号整型
浮点型:float32/float64 0.0 32/64 位浮点数(IEEE754
复数类型:complex64/complex128 (0.0+0.0i) 32/64位复数(实数和虚数)
字符类型:byte ‘\000’ 类似uint8,表示ASCII编码
字符类型:rune ‘\000’ 类似int32,表示UTF-8编码
整型:int/uint 0 32位系统类似int32,64位系统类似int64
指针类型:uintptr nil 无符号整型,长度被设定为足够存放一个指针
  • 可以使用a+bi表示复数,如0.5+1.5i;可以使用内置函数func complex(r, i float64) complex128构造复数类型。
  • 任何指针类型不可直接转换为uintptruintptr可以与unsafe.Pointer相互转换,unsafe.Pointer可以实现对任意数据类型的强制转换(使用unsafe.Pointer),但这是危险的操作。
  • 字符类型使用单引号表示,默认为rune类型,当为ASCII编码范围时,可以转换为byte类型。

五、运算符与优先级

优先级 运算符
7 ^:按位补足, !:非
6 *:乘, /:除, %:取余, <<:位左移, >>:位右移, &:按位与, &^:位清除(置0)
5 +:加, -:减, |:按位或, ^:按位异或
4 == != < <= >= >
3 <-
2 &&
1 ||

可以通过使用括号来临时提升某个表达式的整体运算优先级。

六、变量

声明变量的一般形式是使用var关键字:var identifier type;需要注意的是,Go在声明变量时将变量的类型放在变量的名称之后。

var a int  // 声明变量
var a int = 1  // 声明变量并设置初值
var a, b int = 1, 2  // 一次声明多个同类型变量
var a, b, i, s1, s2 = true, false, 3, "hello", "world"  // 让编译器自动推测类型
// 声明多个不同类型变量
var (
    a, c int = 1, 2
    b bool
    str string
    t *int // 指针类型
)

声明变量的简短形式,使用:=赋值操作符。:=只能在函数内使用,不可以用于全局变量的声明与赋值。使用操作符:=可以高效地创建一个新的变量,称之为初始化声明。

a := 1  // var a int = 1
s := "Hello World!"  // var s string = "Hello World!"
b, str := 2, "No Way Home."

匿名变量_,伪接受数值,数值将直接被丢弃,不可访问其数值。

func getData() (int, int) {
	return 10, 20
}
func main() {
    a, _ := getData()  // 10, _
    _, a = getData()  // _, 20
}
  • 变量作用域
    • 局部变量:
      • 每一个 {} 可以被视为一个作用域,它包括函数if语句、for语句等。
      • 在局部作用域定义的变量将在所定义的作用域结束时消亡。
    • 全局作用域
      • 直接定义在包中的函数、变量都是全局变量。
      • 全局变量一旦被定义将始终存在,直到程序终止。
    • 值类型和引用类型
    • Golang中,数据类型可以分为两大类:值类型(Value Types)引用类型(Reference Types)
    • 值类型是指变量直接存储了实际的数据,并且每个变量都拥有独立的存储空间。当一个值类型的变量被赋给另一个变量时,会进行值拷贝,对其中一个变量的修改不会影响到原始变量。
      • 值类型包括:整型(int、uint、int8等)浮点型(float32、float64)复数(complex64, complex128)布尔型(bool)字符串型(string)数组(array)结构体(struct)
    • 引用类型并不直接存储数据本身,而是存储指向数据的指针,当复制一个引用类型的变量时,复制的是指针,新旧变量将指向相同的底层数据。
      • 引用类型包括:切片(Slices)映射(Maps)通道(Channels)接口(Interfaces)函数(Functions)

在函数参数传递时,值类型和引用类型的行为也不同。值类型参数在传递给函数时会创建一个副本,而引用类型参数传递的是指针的副本,所以函数内部对引用类型参数的修改会影响原始数据。

七、常量

const声明常量:

const a int = 10  // 常量必须初始化
const a = 10  // 自动解析常量类型
const a, b int = 1, 2  // 定义同类型多常量
// 定义不同类型多常量
const (
    a int = 10
    s string = "Hello World!"
    pi float64 = 3.1415926535
)

常量还可以用作枚举:

const (
    Monday = 1
    Tuesday = 2
    Wednesday  = 3
)

自增枚举可以使用iotaiota是特殊常量,在const关键字出现时将被重置为0const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引,不同const块互不干扰)。

package main
import "fmt"
func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //独立值,iota += 1,即3
            e          //"ha"(复用上一行,不推荐省略定义) iota += 1,即4
            f = 100    //独立值,iota +=1,5
            g          //100(复用上一行,不推荐省略定义)  iota +=1,即6
            h = iota   //7,恢复计数
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}

以上实例运行结果为:

0 1 2 ha ha 100 100 7 8
END .

相关系列文章

×