2011-06-21 1 views
13

string 1文字の長さのタイプCharを使用しようとしています。私ができないのは "コンストラクタ"を作ることです。私は完全に明白な何かが欠けていることを知っているc1c2が "A" である必要はなく、 "ABC"Goでは、文字列基本型の型の「コンストラクタ」を作成するにはどうすればよいですか?

 
    type Char string 

が宣言

 
    var c1 Char("abc") 
    var c2 Char = "abc" 

これらは間違っていると、そのタイプを使用することができますChar型を宣言します

私が本当に欲しいのは、Charを1文字に制限する "コンストラクタ"です。

func Charを持つもちろん
 
func Char(s string) Char { 
    var ch string = s[0] 
    return ch 
} 

はそれを

 
type.go:8: Char redeclared in this block 

を行う方法ではありませんコンストラクタでtype初期化を強制するための方法はありますか?私は正しい質問をしていますか?

は違った状態とさせて頂いております:ユーザーがvar c Char = "abc"言えば、彼らはタイプCharの無効な値を持つことになります - func NewChar(string) CharCharとして年代にのみ有効なコンストラクタをユーザーに強制する方法はありますか?

+0

golangではなく、Goのプログラミング言語です。 – peterSO

+8

golangについて申し訳ありません - 私はそれを標準的な参考文献として見ていたと思っていました。 "golang"と "golang"のゴーグルの違いは大きいので、常に "golang"というフレーズを礼儀として入れようとしましたが、提案には開きます –

+0

コンストラクターを強制したい場合は、パブリックインターフェイスと、インターフェイスを実装するprivate構造体を返すコンストラクタを公開します。 –

答えて

8

これはcharパッケージです。未記入のCharstructフィールド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 ก 
+0

@mattn:done。ありがとう – peterSO

+0

は完璧な意味を(再び)します。非常に多くの言語と相反するパラダイムがあるため、正しいゾーンに入ることが困難なことがあります。私はまだインターフェイス全体を念頭に置いています。クールですが、有機的になる前に量子的に理解しておく必要があります。 –

+0

このコードでエラーが発生しました:「hello(型文字列)をint型に変換できません」 – RoboTamer

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のスタイルでは、パッケージはXXXオブジェクトに対してNewXXX()関数を提供します。

type Client struct { 
    // ... 
} 

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

UPDATE:

あなたは "文字列の1つの要素" として、シャアを意味する場合は、次のように定義する必要があります。

type Char int 

それとも

type Char byte 

あなたの定義

type Char string 

は、 "文字列" の再定義です。その後、文字列を格納することができます。

+0

私は非常に明確だとは思わない。 'type Char string'では、' string'はベースタイプなので、 'var c Char =" abc "'と言うことができます。 'c ==" abc "'しかしそれは間違っています - 'c ==" a "が必要です。私はGoの最初の解釈を傍受したり無効にしたりすることができるかどうか疑問に思っています。var c Char = "abc" '===' c:= Char( "abc") 'この問題に対する感覚的なアプローチ。 –

+0

'func NewType()Type'のおかげでコンストラクタのスタイルに行きます –

+0

はあなたの元の意図を忘れました - ありがとう。これはdbインタフェースのためです。(私は) 'char'はクライアントのエンコーディングに基づいている可能性があります - 私はその時代を臆面もなく無視しています。しかし私はあなたが私よりも正しいと思うし、 'Char'を' uint'に動かすだろうと思うので、ありがとう。コンパイラが独自の型を構築せず、コンストラクタを経由しないようにする方法については、元の質問に関するアイデアはありますか? –

0

ゴーにおける単一のUnicode文字は、あなたが次のことを行うことができ UINT32で表現されています。コンストラクタの

type Char uint32 
var a Char = 'a' 

の必要はありません、あなただけのリテラル文字を使用することができるからです。

+0

がこれを見ているは​​ずです。ちょうど2つの文字を持つ 'type Char2 string'が必要な場合、問題を解決する方法 - あるいは解決することができますか?実際にはdb 'char'が文字列として主に使用されているので、btw、' string'はユーザの健全性のためです。 –

0

、Goは、特別なコンストラクタ構文のようなものを持っていないことに留意すべきです。しかし、いくつかの慣習があります。一般的に、カスタム型があり、コンストラクタが必要な場合は、必要なパラメータをとり、初期化を行い、その型の1つのインスタンスを返すNewT()関数を記述します。

+0

パッケージtがタイプTを実装していてコンストラクタが1つしかない場合、それは簡単に読むことができます。例:http://golang.org/search?q=New。 – peterSO

関連する問題