4

我正在定义一种类型。我注意到 Go 有一个被调用的类型uint8和一个被调用的函数uint8来创建一个uint8值。

但是当我尝试为自己做这件事时:

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可行,但感觉就像我是二等公民。我可以编写与类型类型具有相同标识的类型构造函数吗?

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 回答