【Go 精选】基本语法 - 变量声明和初始化

2022-12-24  本文已影响0人  熊本极客

1.基本变量的声明和初始化

声明变量可以使用 var 关键字:var identifier type
声明和初始化变量可以使用: var identifier type = value

# 声明的方式1
var a int
var b bool
var str string

# 声明的方式2
var (
    a int
    b bool
    str string
)

# 声明和初始化
var a int = 15
var i = 5
var b bool = false
var str string = "Go says hello to the world!"

说明Go 的基本数据类型分为整型、浮点型、复数、布尔型和字符串型等

2.指针变量的声明和初始化

程序在内存中存储,每个内存块有一个地址,通常用十六进制数表示,如:0x6b08200xf84001d7f0。Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

声明指针变量可以使用:var identifierPointer *type

var i1 = 5
fmt.Printf("An integer: %d, it's location in memory: %p\n", i1, &i1)
# 输出的内容是 An integer: 5, its location in memory: 0x6b0820

var intP *int
intP = &i1
fmt.Printf("The value at memory location %p is %d\n", intP, *intP)
# 输出的内容是 The value at memory location 0x24f0820 is 5

如下图所示,intP 指向了 i1 所在的内存地址

image.png

3.结构体的定义和初始化

结构体的定义type T struct {a int, b string}

type identifier struct {
    field1 type1
    field2 type2
    ...
}

初始化结构体new{}make、工厂方法

package structPack

type ExpStruct struct {
    I1  int
    F1  float32
    Str string
}

package main

type innnerStruct struct {
    i1  int
    f1  float32
    str string
}

func main() {
    // new 方式初始化
    // 说明:结构体内的变量需要可以直接访问
    struct1 := new(structPack.ExpStruct)
    struct1.I1 = 10
    struct1.F1 = 15.5
    struct1.Str= "Chris"
    fmt.Println("%s", *stuct1)
    
    // {} 方式初始化
    // 说明:结构体内的变量需要可以直接访问
    struct2 := &innnerStruct{10, 15.5, "Chris"}
    var struct3 innnerStruct
    struct3 = innnerStruct{10, 15.5, "Chris"}
    fmt.Println("%s", *stuct3)

    // make 方式初始化
    struct4 := new(chan structPack.ExpStruct)
    fmt.Println("%s", <- stuct4)
}

问题1:结构体 type Point struct { x, y int } 的内存布局?
① 使用 new 初始化

image.png

② 使用 {} 初始化

image.png

问题2:newmake 初始化结构体的区别?
new 的参数是类型、返回值是类型的指针;make 只能初始化 slice、map 以及 channel 类型的对象, 其返回值为类型,而不是指针。

// 参数是类型,返回值是类型的指针,其值被初始化为“零”(类型对应的零值,int 初始化为0,bool初始化为 false 等)
func new(Type) *Type

// 仅用于分配和初始化slice、map 以及 channel 类型的对象,三种类型都是结构体。返回值为类型,而不是指针。
func make(t Type, size ...IntegerType) Type

问题3:如何使用工厂方法创建的结构体并引用?

package matrix

type matrix struct {
    mi1 int
    mf1 float32
}

func NewMatrix(mi1 int, mf1 float32) *matrix {
    m := new(matrix) // 初始化 m
    m.mi1 = mi1
    m.mf1 = mf1
    return m
}

package main

func main() {
    m := matrix.NewMatrix(1, 1.5) 
    fmt.Println("%s", *m)
}

4.容器的定义和初始化

// 1.数组类型
// var identifier [len]type
var arr1 [5]int
for i:=0; i < len(arr1); i++ {
    arr1[i] = i * 2
}

var arrAge = [5]int{18, 20, 15, 22, 16}
var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}

// 2.map类型
// var identifier map[keytype]valuetype
var mapLit map[string]int
var mapAssigned map[string]int

mapLit = map[string]int{"one": 1, "two": 2}
mapAssigned := make(map[string]float32)

mapAssigned["key1"] = 4.5
mapAssigned["key2"] = 3.14159
mapAssigned["two"] = 3
for key, value := range mapAssigned {
     fmt.Printf("key is: %d - value is: %f\n", key, value)
}

// 3.list类型
l := list.New()
l.PushFront("犬小哈教程")
l.PushBack("www.quanxiaoha.com")
for i := l.Front(); i != nil; i = i.Next() {
      fmt.Println(i.Value)
}

注意:不要使用 new 构建 map,而要采用 make,如果错误的使用 new () 分配了一个引用对象,就会获得一个空引用的指针。

上一篇下一篇

猜你喜欢

热点阅读