## Go语言_通神路之五耀篇(1) 顶原

就叫程舰

### 1、Go方法

```package main

import (
"math"
"fmt"
)

type Person struct {
x,y float64
}

func (p Person) Test() float64 {
return math.Sqrt(p.x*p.x+p.y*p.y)
}

func main()  {
value := Person{3,4}
fmt.Print(value.Test())
}```

```package main

import (
"math"
"fmt"
)

type Person struct {
x,y float64
}

func Test(p Person) float64 {
return math.Sqrt(p.x*p.x+p.y*p.y)
}

func main()  {
value := Person{3,4}
fmt.Print(Test(value))
}```

### 2、指针接收者

#### 2.1 概念

```package main

import (
"math"
"fmt"
)

type Person struct {
x,y float64
}

func (v *Person) Scale(f float64) {
v.x = v.y * f
v.y = v.y * f
}

func (p Person)Test() float64 {
return math.Sqrt(p.x*p.x+p.y*p.y)
}

func main()  {
value := Person{3,4}
value.Scale(10)
fmt.Print(value.Test())
}```

#### 2.2 方法与指针重定向

```func ScaleFunc(v *Vertex, f float64) {
v.X = v.X * f
v.Y = v.Y * f
}```

```ScaleFunc(v, 5)  // 编译错误！
ScaleFunc(&v, 5) // OK```

```func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}```
```var v Vertex
v.Scale(5)  // OK
p := &v
p.Scale(10) // OK```

#### 2.3 方法与指针重定向（反向）

```func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func AbsFunc(v Vertex) float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}```

```var v Vertex
fmt.Println(AbsFunc(v))  // OK
fmt.Println(AbsFunc(&v)) // 编译错误！```

```var v Vertex
fmt.Println(v.Abs()) // OK
p := &v
fmt.Println(p.Abs()) // OK```

### 3、接口

#### 3.1 概念理解

```package main

import (
"math"
"fmt"
)

type myFloat float64

type Base interface {
test() float64
}

func (f myFloat)test() float64 {
return math.Sqrt(float64(f))
}

func main()  {

var base Base

f := myFloat(25)

base = f  //f实现接口base

fmt.Print(base.test())
}```

```package main

import (
"math"
"fmt"
)

type myFloat float64

type Base interface {
test() float64
}

func (f *myFloat)test() float64 {
return math.Sqrt(25)
}

func main()  {

var base Base

f := myFloat(25)

base = &f

fmt.Print(base.test())
}```

#### 3.2 底层值为 nil 的接口值

```package main

import "fmt"

type I interface {
M()
}

type T struct {
S string
}

func (t *T) M() {
if t == nil {
fmt.Println("<nil>")
return
}
fmt.Println(t.S)
}```

```(<nil>, *main.T)
<nil>
(&{hello}, *main.T)
hello```

*注意：* 保存了 nil 具体值的接口其自身并不为 nil。

#### 3.3 空接口

```package main

import "fmt"

func main() {
var i interface{}
describe(i)

i = 42
describe(i)

i = "hello"
describe(i)
}

func describe(i interface{}) {
fmt.Printf("(%v, %T)\n", i, i)
}```

```(<nil>, <nil>)
(42, int)
(hello, string)```

%V 意思是value %T是Type

### 就叫程舰

TinyDolphin
2017/11/27
0
0
Silverlight/WPF 系列汇总

Silverlight 解谜游戏系列 -- Silverlight 3 · Silverlight 解谜游戏 之一 新建项目 · Silverlight 解谜游戏 之二 创建题板 · Silverlight 解谜游戏 之三 消除名单 · Silverlight 解谜游...

junwong
2012/03/09
335
0
juniper 中国区合作伙伴

1、北京世纪华风科技发展有限公司 联系地址：北京市西城区黄寺大街26号 德胜置业大厦5号楼1009室 邮　　编：100011 联系电话：400-007-6660 010-57510399 传 真 : 010-6853 9248 公司网址：w...

2017/06/15
0
0
Java 语言的几个缺陷(个人感觉)

Java 语言由于一直要保持源代码及二进制的向后兼容, 所以尽管语法上有了很大的演进, 但有些东西仍然无法触及. 不像有些新生代的语言设计时可以博采众长, 或者像 Scala 那种语言向后兼容性的要...

YanbinQ
2016/07/12
49
0
Go语言_通神路之灵胎篇(6)

1、映射 1.1 概念 go的映射在java中被叫做集合 type Vertex struct { } var m map[string]Vertex 上面是go的映射m，如果用java代替的话，Vertex就是实体类，这样用java8可以写成 Map m = ne...

2018/08/22
0
0

java框架学习日志-13（Mybatis基本概念和简单的例子）

47分钟前
2
0
Java基础：String、StringBuffer和StringBuilder的区别

1 String String：字符串常量，字符串长度不可变。Java中String是immutable（不可变）的。 String类的包含如下定义： /** The value is used for character storage. */private final cha...

watermelon11

2
0
mogodb服务

5
0

Debian项目团队于昨天发布了Debian GNU/Linux 9 "Stretch" 的第7个维护版本更新，重点修复了APT软件管理器中存在的安全漏洞。在敦促每位用户尽快升级系统的同时，Debian团队还发布了Debian ...

linux-tao

4
0
PHP 相关配置

1. php-fpm的pool 编辑php-fpm配置文件php-fpm.con vim /usr/local/php/etc/php-fpm.conf //在[global]部分增加以下内容 include = etc/php-fpm.d/*.conf # 相当与Nginx的虚拟主机文件 “vho......

Yue_Chen

2
0