В 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
только действительный конструктор?
Ответы
Ответ 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])
}