码迷,mamicode.com
首页 > 其他好文 > 详细

Go结构体

时间:2020-01-23 09:53:32      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:案例   ring   值类型   style   注意事项   不同   src   image   int   

1. Go面对“对象”

技术图片

技术图片

 2. 结构体

技术图片

package main
import (
	"fmt"
)


//定义一个Cat结构体,将Cat的各个字段/属性信息,放入到Cat结构体进行管理
type Cat struct {
	Name string
	Age int
	Color string
	Hobby string
	Scores [3]int // 字段是数组...
}

func main() {

	// 张老太养了20只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,
	// 今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,
	// 年龄,颜色。如果用户输入的小猫名错误,则显示 张老太没有这只猫猫。

	//1. 使用变量的处理
	// var cat1Name string = "小白"
	// var cat1Age int = 3
	// var cat1Color string = "白色"

	// var cat2Name string = "小花"
	// var cat2Age int = 100
	// var cat2Color string = "花色"

	//2. 使用数组解决
	// var catNames [2]string = [...]string{"小白", "小花"}
	// var catAges [2]int = [...]int{3, 100}
	// var catColors [2]string = [...]string{"白色", "花色"}
	// //... map[string]string
	

	//3. 使用struct来完成案例

	// 创建一个Cat的变量
	var cat1 Cat  // var a int

	fmt.Printf("cat1的地址=%p\n", &cat1)
	cat1.Name = "小白"
	cat1.Age = 3
	cat1.Color = "白色"
	cat1.Hobby = "吃<?)))><<"
	
	fmt.Println("cat1=", cat1)
	fmt.Println("猫猫的信息如下:")
	fmt.Println("name=", cat1.Name)
	fmt.Println("Age=", cat1.Age)
	fmt.Println("color=", cat1.Color)
	fmt.Println("hobby=", cat1.Hobby)
	
}

技术图片

2.1 结构体内存图

技术图片

 技术图片

2.2 结构体声明

技术图片

2.3 字段/属性

技术图片

2.4 字段注意事项

技术图片

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
}

type Monster struct {
	Name string
	Age  int
}

func main() {

	//定义结构体变量
	var p1 Person
	fmt.Println(p1) //{ 0 [0 0 0 0 0] <nil> [] map[]} //都是nil,显示不一样而已

	if p1.ptr == nil {
		fmt.Println("ok1") //ok1
	}

	if p1.slice == nil {
		fmt.Println("ok2") //ok2
	}

	if p1.map1 == nil {
		fmt.Println("ok3") //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)

	//不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,
	//不影响另外一个, 结构体是值类型
	var monster1 Monster
	monster1.Name = "牛魔王"
	monster1.Age = 500

	monster2 := monster1 //结构体是值类型,默认为值拷贝
	monster2.Name = "青牛精"

	fmt.Println("monster1=", monster1) //monster1= {牛魔王 500}
	fmt.Println("monster2=", monster2) //monster2= {青牛精 500}

}

2.5 创建结构体变量和访问结构体方式

技术图片

技术图片

package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	//方式1
	//先声明再给字段赋值

	//方式2
	p2 := Person{"mary", 20}
	// p2.Name = "tom"
	// p2.Age = 18
	fmt.Println(p2)

	//方式3-&
	//案例: var person *Person = new (Person)
	var p3 *Person = new(Person)
	//因为p3是一个指针,因此标准的给字段赋值方式
	//(*p3).Name = "smith" 也可以这样写 p3.Name = "smith"
	//原因: go的设计者 为了程序员使用方便,底层会对 p3.Name = "smith" 进行处理
	//会给 p3 加上 取值运算 (*p3).Name = "smith"
	(*p3).Name = "smith"
	p3.Name = "john" //

	(*p3).Age = 30
	p3.Age = 100
	fmt.Println(*p3)

	//方式4-{}
	//案例: var person *Person = &Person{}
	//下面的语句,也可以直接给字符赋值
	//var person *Person = &Person{"mary", 60}
	var person *Person = &Person{}
	//因为person 是一个指针,因此标准的访问字段的方法
	// (*person).Name = "scott"
	// go的设计者为了程序员使用方便,也可以 person.Name = "scott"
	// 原因和上面一样,底层会对 person.Name = "scott" 进行处理, 会加上 (*person)
	(*person).Name = "scott"
	person.Name = "scott~~"
	(*person).Age = 88
	person.Age = 10
	fmt.Println(*person)

} 

说明:

技术图片

 2.6 结构体变量在内存中

技术图片

package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func main() {

	var p1 Person
	p1.Age = 10
	p1.Name = "小明"
	var p2 *Person = &p1 //这里是关键-->画出示意图

	fmt.Println((*p2).Age)
	fmt.Println(p2.Age)
	p2.Name = "tom~"
	fmt.Printf("p2.Name=%v p1.Name=%v \n", p2.Name, p1.Name)    // tom~ tom~
	fmt.Printf("p2.Name=%v p1.Name=%v \n", (*p2).Name, p1.Name) // tom~ tom~

	fmt.Printf("p1的地址%p\n", &p1) //p1的地址0xc000004460
	fmt.Printf("p2的地址%p p2的值%p\n", &p2, p2) //p2的地址0xc000006028 p2的值0xc000004460

}

技术图片

 注意:

技术图片

Go结构体

标签:案例   ring   值类型   style   注意事项   不同   src   image   int   

原文地址:https://www.cnblogs.com/yzg-14/p/12230144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!