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
对于用户来说是明智的,因为实际上db
char
主要用作字符串。这是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])
}