Golang学习笔记(二)

276 阅读3分钟

(文章持续更新中...有志同道合的人可以一起探讨下。整个系列(1~8)准备重写,不过都是很基础的入门笔记,想学到很深入的东西则不建议阅读...)

熟悉Go基本语法

变量(内存块)是用来存储数据。类型有:整型、浮点型、布尔型、结构体等。Go 语言的每一个变量都拥有自己的类型,必须经过声明才能开始用。

变量声明基本格式:

var 变量名 变量类型

var a int
var b string
var c []float64 // 切片格式
var d func() bool //  声明一个返回值为布尔类型的函数变量 
var e struct{
    x int
}

批量声明
var (
    a int
    b string
    c []float64 
    d func() bool
    e struct {
        x int
    } 
)

变量声明会默认进行初始化

var 变量名 类型 = 表达式

var hp int = 100

推导式申明,编译器会尝试根据等号右边的表达式推导 hp 变量的类型
var hp = 100

短变量声明并初始化
hp := 10
conn, err := net.Dial("tcp","127.0.0.1:8080")

匿名变量  用_表示,匿名变量不占用命名空间,不会分配内存。匿名变量不会因为多次声明而无法使用。
func GetName() (string, string) {
    return "wu", "winyh"
}
a, _ := GetData()
_, b := GetData()

// 打印浮点数时,可以使用 fmt 包配合动词%f
package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Printf("%f\n", math.Pi)
    fmt.Printf("%.2f\n", math.Pi) // 按默认宽度,2 位精度输出
}

Go语言有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有切片、结构体、函数、map、通道(channel)等

Go 语言的标准库支持对图片像素进行访问(好强大的样子),并且支持输出各种图片格式,如 JPEG、PNG、GIF 等。

Go 语言中不允许将整型强制转换为布尔型,布尔型无法参与数值运算,也无法与其他类型进行转换。 Go 使用类型前置加括号的方式进行类型转换

var a int32 = 1047483647
b := int16(a) // 会截断输出

Go语言指针

  • 类型指针,允许对这个指针类型的数据进行修改。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算
  • 切片,由指向起始元素的原始指针、元素数量和容量组成。

切片比原始指针具备更强大的特性。

计算机堆和栈概念

栈(Stack)是一种拥有特殊规则的线性表数据结构。后进先出(LIFO) 栈可用于内存分配,栈的分配和回收速度非常快。 变量生命周期

func calc(a, b int) int {
    var c int
    c = a * b
    var x int
    x = c * 10
    return x
}

以上默认情况下会将 c 和 x 分配在栈上,这两个变量在 calc() 函数退出时就不再使用,函数结束时,保存 c 和 x 的栈内存再出栈释放内存,整个分配内存的过程通过栈的分配和回收都会非常迅速。

堆和栈分配内存相比,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形成内存碎片。

常量是恒定不变的值,无法被修改

const (
    pi = 3.141592
    e = 2.718281
)

Go语言type关键字(类型别名)

type TypeAlias = Type

package main

import (
    "fmt"
)
// 将NewInt定义为int类型
type NewInt int

func main() {
    // 将a声明为NewInt类型
    var a NewInt
    // 查看a的类型名
    fmt.Printf("a type: %T\n", a)
}

TypeAlias 只是 Type 的别名,本质上 TypeAlias 与 Type 是同一个类型。