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}
}
写入自己的博客中才能记得长久