Подтвердить что ты не робот

В Go, как мне создать "конструктор" для типа со строковым базовым типом?

пытается иметь тип 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 только действительный конструктор?

4b9b3361

Ответ 1

Это пакет 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

Во-первых, см. следующий пример.

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) - "cast to bytes".

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

type Client struct {
    // ...
}

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

UPDATE:

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

type Char int

или

type Char byte

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

type Char string

переопределяет строку. Затем он может хранить строку.

Ответ 3

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

type Char uint32
var a Char = 'a'

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

Ответ 4

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

type Char string

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