Go语言学习Day05

   隔了很久才开始写这篇学习博文,感觉有些惭愧,确实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))
}

暂时先学到这些,后续继续总结,做事一定不能拖,不然就会越拖越久,这是本人的一点经验!克服拖延症很重要

猜你喜欢

转载自blog.csdn.net/Giser_D/article/details/92050013