Types 在围棋中,我如何创建“围棋”;建造商;对于具有字符串基类型的类型?
正在尝试使用长度为一个字符的Types 在围棋中,我如何创建“围棋”;建造商;对于具有字符串基类型的类型?,types,constructor,go,Types,Constructor,Go,正在尝试使用长度为一个字符的字符串的类型Char。我不能做的是创建一个“构造函数”。我知道我遗漏了一些非常明显的东西 声明Char类型 type Char string 当然,使用类型Char和func Char并不是实现这一点的方法 type.go:8: Char redeclared in this block type.go:8:Char在此块中重新声明 有没有办法通过构造函数强制类型初始化?或者我问的是正确的问题 让我换一种说法:如果用户说var c Char=“abc”他们的类型Cha
字符串的类型Char
。我不能做的是创建一个“构造函数”。我知道我遗漏了一些非常明显的东西
声明Char
类型
type Char string
当然,使用类型Char
和func Char
并不是实现这一点的方法
type.go:8: Char redeclared in this block
type.go:8:Char在此块中重新声明
有没有办法通过构造函数强制类型初始化?或者我问的是正确的问题
让我换一种说法:如果用户说var c Char=“abc”
他们的类型Char
的值无效-有没有办法强迫用户将func NewChar(string)Char
作为Char
的唯一有效构造函数?首先,请参见下面的示例
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字符”。
[]字节的含义是“转换为字节”
而且,Go没有构造函数。在Go的风格中,包为XXX对象提供函数NewXXX()
type Client struct {
// ...
}
func NewClient() *Client {
return &Client{/* ... */}
}
更新:
如果您的意思是Char作为“字符串的1个元素”,那么您应该定义如下
type Char int
或
你的定义
type Char string
是对“字符串”的重新定义。然后它可以存储字符串。Go中的单个unicode字符由uint32表示
您可以执行以下操作:
type Char uint32
var a Char = 'a'
不需要构造函数,因为您可以只使用字符文本。这是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', ก)
}
和其他答案一样,应该注意的是Go没有特殊的构造函数语法。不过也有一些惯例。通常,当您有一个自定义类型并且需要一个构造函数时,您可以编写一个NewT()函数,该函数接受您需要的任何参数,执行初始化并返回所述类型的一个实例
type Char string
func NewChar(s string) Char {
if len(s) == 0 {
return Char("")
}
return Char(s[:1])
}
别以为我说得很清楚。在type Char string
中,string
是基本类型,因此可以说var c Char=“abc”
。然后c==“abc”
但这是错误的-需要c==“a”
。我想我想知道的是,是否有可能拦截和/或禁用Go对var c Char=“abc”
==c:=Char(“abc”)
,或者是否有其他更合理的方法来解决这个问题。感谢func NewType()键入符合您原始意图的构造器的Go样式-谢谢。这是一个db接口,所以(我认为)char
可以基于客户机编码——这是一个我暂时怯懦地忽略的讨厌的问题。但我认为你比我更正确,并且将把Char
移动到uint
,谢谢你。你对最初的问题有什么想法吗?关于如何防止编译器自己构造类型而不通过构造函数?不,我没有任何想法。go没有构造函数。Char(“foo”)
mean-cast从字符串到字符。不是函数调用。如果您想创建构造函数(like)函数,您应该提供func NewChar
。应该已经看到了这一点。假设我们想要一个类型Char2字符串
,其中正好有两个字符,那么如何解决这个问题?或者可以解决吗?顺便说一句,string
对于用户来说是明智的,因为实际上dbchar
主要用作字符串。这是Go编程语言,而不是golang。golang很抱歉-我认为这是一个标准参考。Go和golang之间的区别很大,所以一直试图将“golang”作为礼貌用语,但是开放给建议如果你想强制构造函数,你应该把你的代码放在一个单独的包中,公开公共接口和一个构造函数,这个构造函数将返回一个实现接口的私有结构。这也是非常有意义的。有这么多的语言和相互冲突的范例,有时很难进入正确的领域。我仍在试图把我的思想集中在整个界面上。很酷,但在它成为有机物之前需要更好的理解。我在代码中遇到一个错误:“无法将hello(类型字符串)转换为类型[]int”@RoboTamer use rune。它会起作用的。您会注意到,因为您使用了*Char,所以会打印出一个十六进制的大数字:比如0x7f2814d0af64(它的内存地址),如果包t实现了类型t,并且只有一个构造函数,那么约定是将其命名为New,以便它可以轻松地读取为t.New。例如:。
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)
}
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 ก
type Char string
func NewChar(s string) Char {
if len(s) == 0 {
return Char("")
}
return Char(s[:1])
}