第六篇:自定义集合类型和结构体取代类
第六篇:自定义集合类型和结构体取代类
一、自定义集合类型
集合是一个重要的数据结构,其中,集合中的元素不能重复;集合中的元素无序排列,由于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() // 方法调用
}