Как в Go создать «конструктор» для типа с базовым типом строки? - PullRequest
12 голосов
/ 21 июня 2011

пытается получить тип Char длиной string один символ.что я не могу сделать, это создать «конструктор».Я знаю, что упускаю что-то совершенно очевидное.

объявить тип Char

  type Char string

можно использовать этот тип с объявлением

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

это неправильно: c1 и c2 должны быть "a", а не "abc"

что я действительно хочу, так это "конструктор", ограничивающий Char одним символом

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

изКонечно, наличие type Char и func Char - это не способ сделать это

 type.go:8: Char redeclared in this block

Есть ли способ заставить type инициализацию через конструктор?или я даже задаю правильный вопрос?

позвольте мне сказать иначе: если пользователь скажет var c Char = "abc", у него будет неверное значение для типа Char - есть ли способ заставить пользователя ввести func NewChar(string) Char как Char единственный допустимый конструктор?

Ответы [ 4 ]

8 голосов
/ 21 июня 2011

Это пакет 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 ก
2 голосов
/ 21 июня 2011

Сначала см. Следующий пример.

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) «приведено к символам Юникода».Значение байта (ов) [] - это «приведение к байту».

И, Go не имеет конструктора.В стиле Go пакет предоставляет функцию NewXXX () для объекта XXX.

type Client struct {
    // ...
}

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

ОБНОВЛЕНИЕ:

Если вы имеете в виду Char как «1 элемент строки», вы должны определить следующее:*

Ваше определение

type Char string

переопределено как "строка".Тогда он может хранить строку.

0 голосов
/ 21 июня 2011

Наряду с другими ответами следует отметить, что в Go нет такой вещи, как специальный синтаксис конструктора. Есть некоторые соглашения, хотя. Обычно, когда у вас есть пользовательский тип и вам нужен конструктор, вы пишете функцию NewT (), которая принимает любые необходимые параметры, выполняет инициализацию и возвращает один экземпляр указанного типа.

type Char string

func NewChar(s string) Char {
    if len(s) == 0 {
       return Char("")
    }
    return Char(s[:1])
}
0 голосов
/ 21 июня 2011

Один символ Unicode в Go представлен как uint32. Вы можете сделать следующее:

type Char uint32
var a Char = 'a'

Нет необходимости в конструкторе, поскольку вы можете просто использовать литерал символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...