2017-10-11 29 views
1

タイプを宣言するとき、私は行くを学んで行くツアーで、コードのこの作品に出会ったんだ:方法の曖昧ゴー

ここ
package main 

import (
    "fmt" 
    "math" 
) 

type MyFloat int 

func (f MyFloat) Abs() float64 { 
    if f < 0 { 
     return float64(-f) 
    } 
    return float64(f) 
} 

func (f MyFloat) run() string{ 
    fmt.Println("This is called") 
    return "Hey there" 
    } 

func main() { 
    f := MyFloat(-math.Sqrt2) 
    fmt.Println(f.Abs()) 
    fmt.Println(f.run()) 
} 

我々はMyFloat名前付きの型を宣言し、戻り値の型はのfloat64です。私はfloat64だけを返すメソッドを宣言できると思っていました。上記の場合、文字列を返すメソッドrun()を宣言しました。これはどのように可能ですか?なぜ私はこのような特定の戻り値の型を持たない型を宣言できません。type MyFloat

Example in Playground

+1

'type'を宣言する際のポイントとは何ですか(例えば、あなたの質問に' type MyFloat'など)? – putu

+0

@putu ok。では、 'run()'はどのように機能しましたか? –

+3

'run()'は型宣言*ではないメソッドなので、* rule *は異なります。メソッド/関数は値を返しません。 'func main()'を実行します。任意の型( 'float64'に限定されない)を持つ値を返すことも可能です。 'string、float64、MyFloat'など... *型宣言* **は型を返さないことに注意してください。それは基本的な表現が*型名の後ろに与えられるユーザ定義型を作ります( 'MyFloat'の基になる型は' float64'です)。 – putu

答えて

1

あなたは種類や方法を混乱されています。 putuがすでにコメントに夢中になっているので、型は何も返さない。ハンドウェイのような方法では、ほとんどの型は単にメソッドを*に結びつけることができるデータ構造です。関数本体はまったく異なっていないことを

// func (f MyFloat) Abs() float64 { 
func Abs(f MyFloat) float64 { 
    if f < 0 { 
     return float64(-f) 
    } 
    return float64(f) 
} 

// func (f MyFloat) run() string { 
func run(f MyFloat) string { 
    fmt.Println("This is called") 
    return "Hey there" 
} 

注:

あなたの例のメソッドを書くための別の方法はこれです。違いは、これらの関数をどのように呼び出すかです。意味的には同等です。メソッドの受信者は、関数の暗黙的な最初の引数になります。

[*]これは、データを保持しない関数型を無視します。 net/http.HandlerFuncは、標準ライブラリの重要な例です。

type HandlerFunc func(ResponseWriter, *Request)