Go语言学习Day05
  TEZNKK3IfmPf 2023年11月15日 20 0
go

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

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: LeetCode-----替换空格 下一篇: 8.WPF命令
  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月15日   26   0   0 go定时器
  TEZNKK3IfmPf   2023年11月14日   27   0   0 go变量
  TEZNKK3IfmPf   2023年11月14日   35   0   0 字符串go
  TEZNKK3IfmPf   2023年11月14日   28   0   0 go函数
  TEZNKK3IfmPf   2023年11月15日   21   0   0 go
TEZNKK3IfmPf