2011-06-21 17 views
13

एक प्रकार Char टाइप करने का प्रयास कर रहा है जो एक string एक वर्ण लंबा है। जो मैं करने में असमर्थ हूं वह "कन्स्ट्रक्टर" बना रहा है। मुझे पता है कि मैं कुछ पूरी तरह से याद कर रहा हूँ।गो में, मैं एक स्ट्रिंग बेस प्रकार वाले प्रकार के लिए "कन्स्ट्रक्टर" कैसे बना सकता हूं?

Char प्रकार की घोषणा

 
    type Char string 

एक घोषणा

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

इन गलत हैं के साथ उस प्रकार का उपयोग कर सकते हैं: c1 और c2 होने के लिए "एक" की जरूरत है, नहीं "abc"

जो मैं वास्तव में चाहता हूं वह चार से एक वर्ण को सीमित करने के लिए "कन्स्ट्रक्टर" है

 
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) CharChar के रूप में के ही मान्य निर्माता में उपयोगकर्ता के लिए मजबूर करने के लिए किसी भी तरीका है?

+0

यह गो प्रोग्रामिंग भाषा है, गोलांग नहीं। – peterSO

+8

गोलांग के बारे में खेद है - सोचा था कि मैं इसे मानक रेफरी के रूप में देख रहा था। "गो" बनाम "गोलांग" के लिए गॉगलिंग के बीच का अंतर बहुत बड़ा है, इसलिए हमेशा "गोलांग" वाक्यांश को सौजन्य के रूप में रखने की कोशिश की गई है, लेकिन सुझावों के लिए खुला –

+0

यदि आप कन्स्ट्रक्टर को मजबूर करना चाहते हैं, तो आपको अपना कोड अलग से रखना चाहिए पैकेज, सार्वजनिक इंटरफ़ेस और एक कन्स्ट्रक्टर का पर्दाफाश करें जो एक निजी संरचना को वापस लाएगा जो इंटरफ़ेस लागू करता है। –

उत्तर

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

@ मैटन: किया गया। धन्यवाद – peterSO

+0

सही समझ (फिर से) बनाता है। इतनी सारी भाषाओं और विरोधाभासी प्रतिमानों के साथ कभी-कभी सही क्षेत्र में जाना मुश्किल होता है। अभी भी पूरे दिमाग के चारों ओर अपने दिमाग लपेटने की कोशिश कर रहा है। ठंडा, लेकिन यह कार्बनिक बनने से पहले एक अच्छी तरह से बेहतर समझ की जरूरत है। –

+0

मुझे इस कोड के साथ एक त्रुटि मिलती है: "हैलो (प्रकार स्ट्रिंग) को टाइप करने के लिए [] 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 का अर्थ "यूनिकोड वर्णों में डाला गया" है। [] बाइट्स का अर्थ "बाइट्स पर डाला गया" है।

और, गो में कंस्ट्रक्टर नहीं है। गो की शैली में, पैकेज XXX ऑब्जेक्ट के लिए फ़ंक्शन न्यूXXएक्स() प्रदान करता है।

type Client struct { 
    // ... 
} 

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

अद्यतन:

आप "स्ट्रिंग का 1 तत्व" के रूप में चार मतलब हैं, तो आप निम्नलिखित के रूप में परिभाषित करना चाहिए।

type Char int 

या

type Char byte 

आपकी परिभाषा

type Char string 

है "स्ट्रिंग" की फिर से परिभाषित। फिर यह स्ट्रिंग स्टोर कर सकते हैं।

+0

मुझे नहीं लगता कि मैं बहुत स्पष्ट हूं। 'टाइप स्ट्रिंग स्ट्रिंग' में, 'स्ट्रिंग' बेसटाइप है, इसलिए कोई भी 'var c char = "abc" 'कह सकता है। फिर 'सी ==" एबीसी "' लेकिन यह गलत है - 'c ==" a "' की आवश्यकता है। मुझे लगता है कि मैं क्या सोच रहा हूं कि यदि 'var c char = "abc" '===' c: = char ("abc") 'की प्रारंभिक व्याख्या को रोकना और/या अक्षम करना संभव है, या यदि अन्य और भी हैं इस समस्या के लिए समझदार दृष्टिकोण। –

+0

'func newType() टाइप' के लिए धन्यवाद 'एक निर्माता के लिए गो स्टाइल –

+0

आपके मूल उद्देश्य को याद किया - धन्यवाद। यह एक डीबी इंटरफेस के लिए है, इसलिए (मुझे लगता है) 'char' क्लाइंट एन्कोडिंग पर आधारित हो सकता है - एक बुरा समस्या मैं उस समय के लिए डरावनी रूप से अनदेखा कर रहा हूं। लेकिन मुझे लगता है कि आप मुझसे ज्यादा सही हैं और 'Char'' 'uint' पर जा रहे हैं, इसलिए इसके लिए धन्यवाद। क्या आपके पास मूल प्रश्न पर कोई विचार है कि कंपाइलर को अपने प्रकार के निर्माण से कैसे बनाए रखना है और कन्स्ट्रक्टर के माध्यम से नहीं जाना है? –

0

जाओ में एक एकल यूनिकोड चरित्र एक uint32 आप निम्न कर सकता का प्रतिनिधित्व करती है:

type Char uint32 
var a Char = 'a' 

एक निर्माता के लिए कोई ज़रूरत नहीं है, क्योंकि आप सिर्फ चरित्र शाब्दिक उपयोग कर सकते हैं।

+0

को यह आना चाहिए था। आइए मान लें कि हम 'टाइप 2 स्ट्रिंग' टाइप करना चाहते हैं जहां इसमें दो अक्षर होंगे, फिर समस्या को हल करने के लिए - या इसे हल किया जा सकता है? बीटीडब्ल्यू, यूजर सैनिटी के लिए 'स्ट्रिंग', क्योंकि अभ्यास में एक डीबी 'char' ज्यादातर स्ट्रिंग के रूप में उपयोग किया जाता है। –

0

अन्य उत्तर के साथ, यह ध्यान दिया जाना चाहिए कि जाओ ऐसी कोई बात नहीं के रूप में विशेष निर्माता वाक्य रचना है। यद्यपि कुछ सम्मेलन हैं। आम तौर पर जब आपके पास कस्टम प्रकार होता है और एक कन्स्ट्रक्टर की आवश्यकता होती है, तो आप एक न्यूटी() फ़ंक्शन लिखते हैं जो आपको आवश्यक पैरामीटर लेता है, प्रारंभिक करता है और कहा गया प्रकार का एक उदाहरण देता है।

type Char string 

func NewChar(s string) Char { 
    if len(s) == 0 { 
     return Char("") 
    } 
    return Char(s[:1]) 
} 
+0

यदि कोई पैकेज टी लागू करता है तो टी टाइप होता है और केवल एक कन्स्ट्रक्टर होता है, तो सम्मेलन इसे नाम देना है ताकि नया यह आसानी से t.New के रूप में पढ़ता है। उदाहरण के लिए: http://golang.org/search?q= नया। – peterSO

संबंधित मुद्दे

 संबंधित मुद्दे