尝试将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
}只是有效的构造函数?
答案 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])
}