首先golang type 可以用来定义 结构体(struct)、接口(interface)、函数(type A func(int, int))、新类型(type I int)
再,以下都是博主手敲的 ,结合官方文档自己理解的,如果有哪里写错了,你咬我啊~~
引:
首先要先谈 别名和新类型
//这里定义了一个新类型 objMap 定义了一个新的结构体类型(理解的 如果错啦 ,评论区帮忙提醒下)
type objMap struct {
X int
Y string
}
//这里定义了新的 类型 m ,和 objMap 内存布局完全一样,但是是两个不痛的类型
type m objMap
1、type定义函数
先说函数吧,毕竟理解起来比较蛋疼,go函数容易和go方法混掉,php 和java,net 也没分那么清楚
来,跟着博主的思路来:
下面这玩意 叫函数
定义:(func+函数名+ 参数 + 返回值(可选) + 函数体)
调用: function(variable,参数列表)
func main(){
//单个
fmt.Println(add(2,2))
}
func add(x int,y int ) int{
//返回值
return x * y
}
下面那玩意叫方法
定义:(func+接收者(不好理解,你就理解成这个位置可以放自定义类型就是上面用type定义的那4种类型)+ 函数名+ 参数 + 返回值(可选) + 函数体) //自定义类型,都可以有方法,不仅仅是结构体
调用: variable.function(参数列表)
type MyFloat float64;
func (f MyFloat) Abs()float64{
if f<0{
return float64(-f)
}
return float64(f)
}
func main() {
f:=MyFloat(-math.Sqrt2);
fmt.Println(f.Abs1())
}
有时候你会碰到 自定义参数里面加了一个* 比如 func (a *int)abs() int{},这个星(我理解就是指针指向a这个存储空间的意思)
看看下面这个代码
func (ax ageVal) testAge1() int{//ageNew 值没变的
ax=ax * 5;
return 0
}
func (ax *ageVal) testAge2() int{//ageNew 变的
*ax=*ax * 8;
return 0
}
func main() {
var ageNew ageVal=2
ageNew.testAge1();
fmt.Println("ageNew=",ageNew)//ageNew=2
ageNew.testAge2();
fmt.Println("ageNew=",ageNew)//ageNew=16
}
如果你不理解上面那个指针在go方法中的用法,我举个例子,你理解下 就 就是下面那个意思 (下面是 javascript的例子)
var a=1;
function b(c,callback){
c+=1;
callback(c)
};
b(a,function(c){
a=c;
console.log(a);//这个时候a等于2
});
好了,你如果还看不懂 ,到群里问问大家吧。会进群的 基本都是看到这篇博文的 。
2、定义接口
没啥特别的 我备注直接写在代码上,方便大家理解
package main
import "fmt"
type Abst interface {
Abs() float64
}
func main(){
f:=MyFloatx(2);
fmt.Println(f.Abs()) //4
d:=Mapx{2,6};
fmt.Println(d.Abs()) //8
//定义a b接口为Abst类型
var a,b Abst;
//本来 f.Abs() 来调用直接 是 调用Abs方法 现在 相当于 走的Abst接口 的Abs方法 然后根据传入类型不同 调用不同的Abs() 不同 下面两个方法
a=f;
fmt.Println(a.Abs())//4
b=&d;
fmt.Println(b.Abs())//8
}
type MyFloatx float64;//定义新类型
type Mapx struct {//定义新结构体
x,y float64
}
//定义 Abs方法的MyFloatx 参数处理方法
func (f MyFloatx) Abs() float64{
f=f*2;
return float64(f);
}
//定义 Abs方法稤mapx结构体参数处理方法
func (v *Mapx) Abs() float64{
a:=v.x+v.y
return a;
}