4

タイプを定義しています。Go には、呼び出された型と、値を作成するuint8関数が呼び出されていることに気付きました。uint8uint8

しかし、私が自分でこれをやろうとすると:

12:    type myType uint32

14:    func myType(buffer []byte) (result myType) { ... }

エラーが発生します

./thing.go:14: myType redeclared in this block
    previous declaration at ./thing.go:12

それを変更するfunc newMyTypeと機能しますが、私は二級市民のように感じます. 型 type と同じ ident を持つ型コンストラクター関数を記述できますか?

4

1 に答える 1

5

uint8()関数でもコンストラクターでもなく、型変換です。

プリミティブ型 (または他の明らかな変換ですが、正確な法則はわかりません) の場合、コンストラクターを作成する必要はありません。

これを簡単に行うことができます:

type myType uint32
v := myType(33)

値を作成するときに行う操作がある場合は、「make」関数を使用する必要があります。

package main

import (
    "fmt"
    "reflect"
)

type myType uint32

func makeMyType(buffer []byte) (result myType) {
    result = myType(buffer[0]+buffer[1])
    return
}

func main() {
    b := []byte{7, 8, 1}
    c := makeMyType(b)
    fmt.Printf("%+v\n", b)
    fmt.Println("type of b :", reflect.TypeOf(b))
    fmt.Printf("%+v\n", c)
    fmt.Println("type of c :", reflect.TypeOf(c))
}

関数の名前付けはnewMyType、ポインターを返す場合にのみ使用する必要があります。

于 2012-06-22T13:20:23.347 に答える