1

これが私が言いたいことです:遊び場に行く

「StringType」タイプは文字列であり、それ以上のものではありません。コンパイラは 21 行目についてエラーを出しますが、何らかの理由で 16 行目は問題なく動作します (21 行目をコメントし、22 行目のコメントを外した場合)。

これらの 2 つの行の違いは何ですか (両方とも同じ関数に StringType を渡しているため)、一方が機能し、もう一方が機能しないのはなぜですか?

インラインのコードは次のとおりです。

package main

import (
    "fmt"
    "strings"
)

type StringType string

const (
    FirstString  = "first"
    SecondString = "second"
)

func main() {
    fmt.Println(strings.Contains(FirstString, SecondString))    // line 16
}

func myFunc(a StringType, b StringType) bool {

    return strings.Contains(a, b)                               // line 21
    //return false
}
4

3 に答える 3

3

Go には厳密な型付けシステムがあります。StringTypestringは同じ型ではなく、型変換を行う必要があります。

Go の仕様には次のように記載されています。

非定数値 x は、次のいずれかの場合に型 T に変換できます。

x は T に代入可能です
。x の型と T は同じ基になる型を持ちます。
...
x は、型 T の値で表現可能な型なし定数です

StringTypeの基になる型があるためstring、この変換が可能です。

func myFunc(a StringType, b StringType) bool {

    return strings.Contains(string(a), string(b))
    //return false
}

また、FirstStringSecondStringは StringType で表現できる型指定されていない定数であるためStringType、仕様に記載されているように、これを として渡すことができます。

于 2013-09-06T14:29:12.083 に答える
0

最初のケースでは、文字列を渡していますが、問題ありません。

StringType2 番目のものでは、文字列の代わりに値を渡します。それらを変換して、文字列であることをコンパイラに伝える必要があります。

交換

return strings.Contains(a, b)

return strings.Contains(string(a), string(b))
于 2013-09-06T14:26:44.347 に答える
0

は typeでStringTypeないため、 typestringの何にも割り当てることはできませんstring。Go は強く型付けされた言語です。ただし、 と の基になる型はStringType同じであるため、変換stringを使用できます。

return strings.Contains(string(a), string(b))
于 2013-09-06T14:28:59.073 に答える