• 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}
    }
    
  • 相关阅读:
    JavaScript等比例缩放图片
    乐器的研究
    乐器的研究
    单位的理解
    单位的理解
    那些狗,那些人
    Opencv+Zbar二维码识别(标准条形码/二维码识别)
    二维码解码器Zbar+VS2012开发环境配置
    条形码、二维码的区别和组成结构介绍
    Caffe-Windows下遇到过的问题、技巧、解决方案
  • 原文地址:https://www.cnblogs.com/heris/p/16000054.html
Copyright © 2020-2023  润新知