go中结构体和结构体变量

一 结构体和结构体变量的区别和联系

1 结构体是自定义的数据类型,代表一类事物。

2 结构体变量(实例)是具体的,实际的,代表一个具体变量。

二 结构体变量在内存的布局

三 如何声明结构体

1 基本语法

type 结构体名称 struct {

    field1 type

    field2 type

}

2 举例

type Student struct {
    Name string // 字段
    Age int // 字段
    Score float32 // 字段
}

四 字段/属性

1 基本介绍

a 从概念或叫法上看:结构体字段 = 属性 = field。

b 字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是 引用类型。比如:猫结构体的 Name string 就是属性。

2 注意事项和细节说明

a 字段声明语法同变量。

示例

字段名 字段类型

b 字段的类型可以为:基本类型、数组或引用类型。

c 在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值)。

布尔类型:false

数值是:0

字符串:""

数组类型的默认值和它的元素类型相关。比如 score [3]int 为[0, 0, 0]。

指针、slice 和 map:nil,即还没有分配空间。

3 实战

a 代码

package main
import (
   "fmt"
)

// 如果结构体的字段类型是: 指针、slice和map,它的零值都是 nil ,即还没有分配空间。
// 如果需要使用这样的字段,需要先 make,才能使用。
type Person struct{
   Name string
   Age int
   Scores [5]float64
   ptr *int // 指针
   slice []int // 切片
   map1 map[string]string // map
}

func main() {
   // 定义结构体变量
   var p1 Person
   fmt.Println(p1)
   if p1.ptr == nil {
      fmt.Println("ok1")
   }
   if p1.slice == nil {
      fmt.Println("ok2")
   }
   if p1.map1 == nil {
      fmt.Println("ok3")
   }
   // 使用 slice,一定要 make
   p1.slice = make([]int, 10)
   p1.slice[0] = 100 // ok
   // 使用 map, 一定要 make
   p1.map1 = make(map[string]string)
   p1.map1["key1"] = "tom~"
   fmt.Println(p1)
}

b 测试

{ 0 [0 0 0 0 0] <nil> [] map[]}
ok1
ok2
ok3
{ 0 [0 0 0 0 0] <nil> [100 0 0 0 0 0 0 0 0 0] map[key1:tom~]}

4 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个,  结构体是值类型。

a 代码

package main

import "fmt"

type Monster struct{
   Name string
   Age int
}

func main() {
   // 不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个, 结构体是值类型
   var monster1 Monster
   monster1.Name = "牛魔王"
   monster1.Age = 500
   monster2 := monster1 // 结构体是值类型,默认为值拷贝
   monster2.Name = "青牛精"
   fmt.Println("monster1=", monster1) // monster1= {牛魔王 500}
   fmt.Println("monster2=", monster2) // monster2= {青牛精 500}
}

b 测试

monster1= {牛魔王 500}

monster2= {青牛精 500}

c 图解

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值