在Go中,如何为具有字符串基类型的类型创建“构造函数”?

时间:2011-06-21 05:26:57

标签: types constructor go

尝试将Char类型设为string个字符长。我无法做的是创建一个“构造函数”。我知道我错过了一些完全明显的东西。

声明Char类型

  type Char string

可以使用带声明的那种类型

  var c1 Char("abc")
  var c2 Char = "abc"

这些是错误的:c1c2需要是“a”,而不是“abc”

我真正想要的是将Char限制为一个字符的“构造函数”

 func Char( s string ) Char {
   var ch string = s[0]
   return ch
 }

当然有type Charfunc Char不是这样做的方式

 type.go:8: Char redeclared in this block

有没有办法通过构造函数强制type初始化?或者我甚至在问正确的问题?

让我说明一点:如果用户说var c Char = "abc"他们的类型Char的值无效 - 有没有办法强制用户func NewChar(string) Char Char }只是有效的构造函数?

4 个答案:

答案 0 :(得分:8)

这是char包。请注意未导出的Char struct字段c

package char

type Char struct {
    c rune
}

func New(c rune) *Char {
    return &Char{c}
}

func (c *Char) Char() rune {
    return c.c
}

func (c *Char) String() string {
    return string(c.c)
}

以下是如何使用char包的示例。

package main

import (
    "char"
    "fmt"
)

func main() {
    var c = char.New('z')
    var d = c.Char()
    hello := "Hello, world; or สวัสดีชาวโลก"
    h := []rune(hello)
    ก := char.New(h[len(h)-1])
    fmt.Println(c, "a-"+c.String(), '0' <= d && d <= '9', ก)
}

输出:

z a-z false ก

答案 1 :(得分:2)

首先,请参阅以下示例。

package main

func main() {
    s := "hello 世界"
    //for getting characters from string

    cells := []int(s)
    for _, c := range cells {
        println(c, string(c))
        // You'll get
        // 104 h
        // 101 e
        // 108 l
        // 108 l
        // 111 o
        // 32  
        // 19990 世
        // 30028 界
    }

    bytes := []byte(s)
    for _, b := range bytes {
        println(b, string(b))
        // 104
        // 101
        // 108
        // 108
        // 111
        // 32
        // 228
        // 184
        // 150
        // 231
        // 149
        // 140
    }
}

[] int(s)的含义是“强制转换为unicode字符”。 [] byte(s)的含义是“强制转换为字节”。

而且,Go没有构造函数。在Go的样式中,包为XXX对象提供了函数NewXXX()。

type Client struct {
    // ...
}

func NewClient() *Client {
    return &Client{/* ... */}
}

更新:

如果您将Char表示为“字符串的1个元素”,则应定义如下。

type Char int

或者

type Char byte

您的定义

type Char string

重新定义“string”。然后它可以存储字符串。

答案 2 :(得分:0)

Go中的单个unicode字符由uint32表示 您可以执行以下操作:

type Char uint32
var a Char = 'a'

不需要构造函数,因为您可以只使用字符文字。

答案 3 :(得分:0)

除了其他答案之外,应该注意Go没有特殊的构造函数语法。但是有一些惯例。通常当你有一个自定义类型并需要一个构造函数时,你编写一个NewT()函数,它接受你需要的任何参数,执行初始化并返回一个所述类型的实例。

type Char string

func NewChar(s string) Char {
    if len(s) == 0 {
       return Char("")
    }
    return Char(s[:1])
}