隔了很久才开始写这篇学习博文,感觉有些惭愧,确实Go编程学习中间的时间不能断,一断就容易脱节,接下来简单介绍一下今天学了哪些东西。
1.Go语言中的方法表示,由于Go语言本身没有类似于类的表示形式Class这样的,所以它的方法,主要是通过结构体的形式,来实现的。
方法表示的通用格式: func (结构体) 方法名()返回值{
具体实现的方法
}
示例代码:
//go语言方法 package main import ( "fmt" "math" ) type Vertex struct { X,Y float64 } //类似于结构体的方法 func (v Vertex) Abs() float64{ return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main(){ v:=Vertex{3,4} //定义一个结构体 fmt.Println(v.Abs()) //调用结构体的Abs方法 }
另一种表示方法的方法是在于,前面的结构体类型,是可以被替换成任意类型的,这样方便于Go语言的可扩展性,不得不说设计的很巧妙了。
示例代码:
//type可以自定义数据类型 //语法 type typename datatype package main import ( "fmt" "math" ) 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.Abs()) }
2.方法中结构体作为参数的应用:
这个也比较简单,示例代码就可以理解了
示例代码:
//方法其实就是一个带有参数的函数 package main import ( "fmt" "math" ) type Vertex struct { X,Y float64 } func Abs(v Vertex) float64{ return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main(){ v:=Vertex{3,4} fmt.Println(Abs(v)) }
3.结构体参数做指针的应用,这个和结构体方法的写法是一模一样的,不同的在于意义不一样。
示例代码:
//指针的话,也有类似的用法 只是意义不一样,表示形式都是一样的 package main import ( "fmt" "math" ) type Vertex struct { X,Y float64 } func (v Vertex) Abs()float64{ return math.Sqrt(v.X*v.X +v.Y*v.Y) } func (v *Vertex) Scale(f float64){ v.X = v.X * f v.Y = v.Y * f } func main(){ v:=Vertex{3,4} v.Scale(10) fmt.Println(v.Abs()) }
选择值或指针作为接收者的方法
//选择值或指针作为接收者 package main import ( "fmt" "math" ) type Vertex struct { X,Y float64 } func (v *Vertex) Scale (f float64){ v.X = v.X * f v.Y = v.Y * f } func (v *Vertex)Abs()float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3,4} fmt.Printf("Before scaling: %+v,Abs: %v\n",v,v.Abs()) v.Scale(5) fmt.Printf("After scaling: %+v,Abs:%v\n",v,v.Abs()) }
4.指针重定向:这个可能概念上比较难理解,但是说白了,本质上就是取地址,因为每次不管改变啥,地址是不变的,但是内存地址指向的值会有可能发生改变,理解了这个概念之后,后续的代码就相对来说比较容易了
示例代码:
//指针重定向 package main import "fmt" type Vertex struct { X,Y float64 } func (v *Vertex) Scale(f float64){ v.X = v.X*f v.Y = v.Y*f } func ScaleFunc(v *Vertex,f float64){ v.X = v.X*f v.Y = v.Y*f } func main(){ v:=Vertex{4,3} v.Scale(3) ScaleFunc(&v,10) p:= &Vertex{4,3} p.Scale(3) ScaleFunc(p,8) fmt.Println(v,p) }
package main import ( "fmt" "math" ) type Vertex struct{ X,Y float64 } func (v Vertex) Abs()float64{ return math.Sqrt(v.X * v.X + v.X * v.Y) } func AbsFunc(v Vertex) float64{ return math.Sqrt(v.X * v.X + v.Y * v.Y) } func main(){ v:=Vertex{3,4} fmt.Println(v.Abs()) fmt.Println(AbsFunc(v)) //取地址也是用. 切记 内部原因待查 p:= &Vertex{4,3} fmt.Println(p.Abs()) fmt.Println(AbsFunc(*p)) }
暂时先学到这些,后续继续总结,做事一定不能拖,不然就会越拖越久,这是本人的一点经验!克服拖延症很重要