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!"
2.指针变量的声明和初始化
程序在内存中存储,每个内存块有一个地址,通常用十六进制数表示,如:0x6b0820
或 0xf84001d7f0
。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.png3.结构体的定义和初始化
结构体的定义: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
初始化
② 使用 {}
初始化
问题2:new
和 make
初始化结构体的区别?
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 () 分配了一个引用对象,就会获得一个空引用的指针。
网友评论