go 结构体的实例化方式, 如果结构体的字段类型是:指针,slice,和map的零值都是nil需要先初始化才能使用

1, 普通实例方法

package main

import "fmt"

// 定义老帅结构体,将老师中的各个属性统一放入结构体中管理:
type Teacher struct {
	//变量名字大写外界可以访问这个属性
	Name   string
	Age    int
	School string
}

func structAssignment1(){
	//创建老师结构体的实例、对象、变量:
	var t Teacher = Teacher{}
	fmt.Println(t)
	t.Name ="赵册珊" 
	t.Age = 31
	t.School="黑龙江大学"
	fmt.Println("t",t)
	var t1 Teacher = Teacher{"赵册5",31,"黑龙江大学"}
	fmt.Println("t1",t1)
}
	
func structAssignment2(){
	//方式一, var关键字方法   创建老师结构体的实何、对象、变景;
	var t1 Teacher // 类似 var a int
	fmt.Println(t1)//在未赋值时默认值:{ 0 }
	t1.Name = "马主兵"
	t1.Age = 45
	t1.School ="清华大学"
	fmt.Println(t1)
	fmt.Println(t1.Age + 10)
}

func structAssignment3(){
	//方式三,  new方法    创建老师结构体的实例、对象、变量:
	var t *Teacher = new(Teacher)
	//t是指针,t其实指向的就是地址,应该给这个地址的指向的对象的字段威值
	(*t).Name = "马士兵"
	(*t).Age = 45 //*的作用;根据地址取值
	//为了符合程产员的编程习惯。go挺供了简化的赋值方式:    
        // 原因:go的设计者为了程序员使用方便,底层会对 t.School = "清华大学" 进行处理 会给t加上取值运算(*t).School = "清华大学"
	t.School = "清华大学" //go编译器底层对t.School转化(*t).School = "清华大学"
	fmt.Println(*t)
}

func structAssignment4(){
	//创建老师结构体的实例、对象、变量:
	var t1 *Teacher = &Teacher{"马士:兵",46,"洁华大学"}
	fmt.Println(*t1)

	var t *Teacher = &Teacher{}
	(*t).Name = "写士兵"
	(*t).Age = 45
        /为了符合程产员的编程习惯。go挺供了简化的赋值方式:    
        // 原因:go的设计者为了程序员使用方便,底层会对 t.School = "清华大学" 进行处理 会给t加上取值运算(*t).School = "清华大学"
	t.School ="清华大学"
	fmt.Println(*t)
}

func main() {
	//structAssignment1()
	//structAssignment2()
	structAssignment3()
	//structAssignment4()
}

2, //如果结构体的字段类型是:指针,slice,和map的零值都是nil ,即还没有分配空间 如果需要使用这样的字段,需要先make,才能使用.

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    //切片
}

type Monster struct {
	Name   string
	Age    int
}

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 否则panic: runtime error: index out of range [0] with length 0
	p1.slice = make([]int,10)
	p1.slice[0] = 100 //ok
	//使用map,一定要先make 否则 panic: assignment to entry in nil map
	p1.map1 = make(map[string]string)
	p1.map1["key1"]= "tom~"
	fmt.Println(p1)


	//不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,//不影响另外一个,结构体是值类型
	var monster1 Monster
	monster1.Name ="牛魔王"
	monster1.Age = 500
	monster2 := monster1  //结构体是值类型,默认为值搒贝monster2.Name =“青牛精”
	fmt.Println("monster1=", monster1)//monster1={牛魔王500}
	fmt.Println("monster2=" , monster2)//monster2={青牛精5o0}
}
posted @ 2022-03-13 12:12  ty1539  阅读(129)  评论(0编辑  收藏  举报