2011-06-21 61 views
13

cố gắng để có loại Char dài string một ký tự. những gì tôi không thể làm là tạo ra một "nhà xây dựng". Tôi biết tôi đang thiếu một cái gì đó hoàn toàn rõ ràng.Trong Go, làm cách nào để tạo một "hàm tạo" cho một kiểu có kiểu chuỗi ký tự?

khai báo kiểu Char

 
    type Char string 

có thể sử dụng kiểu đó với một tuyên bố

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

đây là sai: c1c2 cần phải "a", không phải "abc"

điều tôi thực sự muốn là "hàm tạo" để giới hạn Char thành một ký tự

 
func Char(s string) Char { 
    var ch string = s[0] 
    return ch 
} 

tất nhiên có type Charfunc Char không phải là cách để làm điều đó

 
type.go:8: Char redeclared in this block 

là có cách nào cho để buộc type khởi thông qua một nhà xây dựng? hoặc tôi thậm chí hỏi câu hỏi đúng?

cho phép tôi nói khác: nếu người dùng nói var c Char = "abc" họ sẽ có giá trị không hợp lệ cho loại Char - có cách nào để buộc người dùng vào func NewChar(string) Char làm nhà xây dựng hợp lệ duy nhất của Char không?

+0

Đó là ngôn ngữ lập trình Go chứ không phải golang. – peterSO

+8

xin lỗi về golang - nghĩ rằng tôi đã nhìn thấy đó là một ref tiêu chuẩn. sự khác biệt giữa goggling cho "go" vs "golang" là rất lớn, do đó, luôn luôn cố gắng đặt cụm từ "golang" như một lịch sự, nhưng mở để gợi ý –

+0

Nếu bạn muốn ép buộc, bạn nên đặt mã của bạn trong một riêng biệt gói, hiển thị giao diện công cộng và một hàm tạo sẽ trả về một cấu trúc riêng để triển khai giao diện. –

Trả lời

8

Đây là gói char.Lưu ý trường chưa được xuất hiện Charstructc.

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) 
} 

Đây là ví dụ về cách sử dụng gói 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', ก) 
} 

Output:

z a-z false ก 
+0

@mattn: xong. cảm ơn – peterSO

+0

có ý nghĩa hoàn hảo (một lần nữa). với rất nhiều ngôn ngữ và các mô hình xung đột đôi khi rất khó để đi vào đúng khu vực. vẫn cố gắng bọc tâm trí của tôi xung quanh toàn bộ giao diện. mát mẻ, nhưng cần một sự hiểu biết tốt hơn lượng tử trước khi nó trở thành hữu cơ. –

+0

Tôi gặp lỗi với mã này: "không thể chuyển đổi hello (loại chuỗi) để nhập [] int" – RoboTamer

2

Lúc đầu, xem ví dụ sau.

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 
    } 
} 

Ý nghĩa của [] int (s) được "truyền đến ký tự unicode". Ý nghĩa của [] byte (s) được "truyền thành byte".

Và, Go không có hàm tạo. Theo kiểu của Go, gói cung cấp hàm NewXXX() cho đối tượng XXX.

type Client struct { 
    // ... 
} 

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

UPDATE:

Nếu bạn có ý nghĩa Char là "1 phần tử của chuỗi", bạn nên xác định như sau.

type Char int 

Hoặc

type Char byte 

định nghĩa của bạn

type Char string 

được tái định nghĩa của "chuỗi". Sau đó, nó có thể lưu trữ chuỗi.

+0

không nghĩ rằng tôi đang rất rõ ràng. trong 'type Char string',' string' là kiểu gốc, vì vậy ta có thể nói 'var c Char =" abc "'. sau đó 'c ==" abc "' nhưng điều đó sai - cần 'c ==" a "'. Tôi đoán những gì tôi đang tự hỏi là nếu nó có thể đánh chặn và/hoặc vô hiệu hóa giải thích ban đầu của Go của 'var c Char =" abc "' === 'c: = Char (" abc ")', hoặc nếu có khác cách tiếp cận hợp lý cho vấn đề này. –

+0

cảm ơn kiểu dáng 'func NewType() Type' Go cho một hàm tạo –

+0

đã bỏ lỡ ý định ban đầu của bạn - cảm ơn. điều này là dành cho một giao diện db, vì vậy (tôi nghĩ) 'char' có thể được dựa trên mã hóa khách hàng - một vấn đề khó chịu tôi hèn nhát bỏ qua cho thời gian. nhưng tôi nghĩ bạn đúng hơn tôi và sẽ chuyển 'Char' thành' uint', cảm ơn vì điều đó. bạn có bất kỳ ý tưởng về câu hỏi ban đầu về làm thế nào để giữ cho trình biên dịch từ xây dựng các loại trên riêng của mình và không phải đi qua các nhà xây dựng? –

0

Một ký tự unicode duy nhất trong Go được đại diện bởi một uint32 Bạn có thể làm như sau:

type Char uint32 
var a Char = 'a' 

Không cần thiết cho một nhà xây dựng, vì bạn chỉ có thể sử dụng các ký tự chữ.

+0

nên đã thấy điều này sắp tới. chúng ta hãy nói rằng chúng ta muốn có một 'loại chuỗi Char2', nơi nó sẽ có chính xác hai ký tự, sau đó làm thế nào để giải quyết vấn đề - hoặc nó có thể được giải quyết? btw, 'string' cho sự tỉnh táo của người dùng, vì trong thực tế, một db' char' chủ yếu được sử dụng như một chuỗi. –

0

Cùng với câu trả lời khác, cần lưu ý rằng Go không có những điều như đặc biệt cú pháp constructor. Có một số công ước mặc dù. Nói chung khi bạn có một kiểu tùy chỉnh và cần một hàm tạo, bạn viết một hàm NewT() nhận bất kỳ tham số nào bạn cần, thực hiện khởi tạo và trả về một cá thể của kiểu đã nói.

type Char string 

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

Nếu gói thực hiện loại T và chỉ có một hàm tạo, quy ước đặt tên là Mới để nó đọc dễ dàng như t.New. Ví dụ: http://golang.org/search?q=New. – peterSO

Các vấn đề liên quan