第六篇:自定义集合类型和结构体取代类

第六篇:自定义集合类型和结构体取代类

一、自定义集合类型

集合是一个重要的数据结构,其中,集合中的元素不能重复;集合中的元素无序排列,由于go中没有集合元素,我们可以通过map实现一个集合元素,使其具备。

增加元素:set

删除元素:delete

判断元素是否存在:isExist

查看集合长度:len

//定义MySet类型
type MySet map[interface{}]bool
//判断元素是否存在
func (m MySet) isExist(a interface{}) bool {
	return m[a]
}
//返回set长度
func (m MySet) len() int {
	return len(m)  // 统计map的长度
}
//设置值
func (m MySet) set(a interface{}) {
	m[a] = true
}
//删除值
func (m MySet) delete(a interface{}) {
	delete(m, a)
}

//测试代码
func main() {
	//创建一个set
	var a MySet = make(MySet)  // 应用类型必须进行初始化,相当于 var a MySet = make(map[interface{}]bool)
	//打印set的长度
	fmt.Println(a.len())
	//放入一个值
	a.set(1)
	//放入一个相同值
	a.set(1)
	a.set("yangyi")
	a.set("yangyi")
	a.set("yangyi")
	//打印长度,还是1
	//fmt.Println(a.len())
	//判断1是否存在
	//fmt.Println(a.isExist(2))
	////删除1
	a.delete(1)
	////判断1是否存在
	fmt.Println(a.isExist(1))
	fmt.Println(a.len())

	for i,_:=range a{
		fmt.Println(i)
	}
}

二、结构体取代类

1 make和new的区别

make是引用类型初始话时使用。

make返回的是Type的具体的值,new返回的是指向Type类型的指针【也不是nil】。

// make
var a map[int]string = make(map[int]string)  // a本来是nil,make之后有值

// new
var a *map[int]string = new(map[int]string)

var duck = new(PDuck)    <===>   var duck = &PDuck{}  

make创造的是具体的类型,比如make([]int, 3, 4),创造出的是引用类型;而new创造出来的是指向该引用类型的指针。

2 结构体取代类

package main

import "fmt"

type Person struct {
	Name string
	Age int
	Gender string
}

func New(name string, age int, gender string) Person{
	return Person{name, age, gender}  // Go语言可以返回局部变量的引用
}

func main() {
	person := New("yangyi", 18, "male")
	fmt.Println(person)  // {yangyi 18 male}
}

可以把一个包可以当作一个类,具体方式如下所示。

// person包的person_class.go文件下定义
package person

import "fmt"

type Person struct {
	Name string
	Age int
	Gender string
}

// 创建结构体对象
func New(name string, age int, gender string) Person{
	return Person{name, age, gender}
}

// 类调用方法
func (p *Person)TellName()  {
	fmt.Println(p.Name)
}

// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

package main

import (
	"day01/person"
)

func main() {
	// 第一种方式
	var person person.Person = person.New("yangyi", 18, "male")
	// 第二种方式
	person := person.New("yangyi", 18, "male")
	
	// 对象调用方法
	person.TellName()  // 方法调用
}
posted @ 2023-04-03 20:46  YangYi215  阅读(24)  评论(0编辑  收藏  举报