書籍:The Way To Go,第二部分

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

Interface

type Shaper interface {     Area() float32}type Square struct {     side float32}func (sq *Square) Area() float32 {     return sq.side * sq.side}func main() {     sq1 := new(Square)     sq1.side = 5     areaIntf := Shaper(sq1)               // areaIntf := sq1     fmt.Printf(“%f\n”, areaIntf.Area())}
r := Rectangle{5, 3}q := &square{5}shapes := []Shaper{r, q}for n, _ := range shapes {     fmt.Println("Shape details: ", shapes[n])     fmt.Println("Area is: ", shapes[n].Area())}
type stockPosition struct {     ticker string     sharePrice float32     count float32}func (s stockPosition) getValue() float32 {     return s.sharePrice * s.count}type car struct {     make string     model string     price float32}func (c car) getValue() float32 {     return c.price}type valuable interface {     getValue() float32}func showValue(asset valuable) {     fmt.Printf(“%f\n”, asset.getValue())}func main() {     var o valuable = stockPosition("GOOG", 577.20, 4)     showValue(o)     o = car{"BMW", "M3", 66500}     showValue(o)}
type File interface {     ReadWrite     Lock     Close()}type ReadWrite interface {     Read(b Buffer) bool     Write(b Buffer) bool}type Lock interface {     Lock()     Unlock()}
switch t := areaIntf.(type) {     case *Square: ...     case *Circle: ...     case float32: ...}func classifier(items ...interface{}) {     for i, x := range items {         switch x.(type) {         case bool:    ...         case int: ...         case nil: ...         }     }}classifier(13, -14.3, “BELGIUM”, nil, false)
type List []intfunc (l List) Len() int { return len(l) }func (l *List) Append(val int) { *l = append(*l, val) }type Appender interface { Append(int) }type Lener interface { Len() int }func CountInto(a Appender, start, end int) {     for i := start; i <= end; i++ {          a.Append(i)     }}func LongEnough(l Lener) bool {     return l.Len()*10 > 42}func main() {     var lst List                // A bare value     // compiler error:     // cannot use lst (type List) as type Appender in function     // argument: List does not implement Appender (Append method      // requires pointer receiver)     // CountInto(lst, 1, 10)        if LongEnough(lst) {        // VALID: Identical receiver type          fmt.Printf(“- lst is long enough”)     }     plst := new(List)           // A pointer value     CountInto(plst, 1, 10)      // VALID: Identical receiver type     if LongEnough(plst) {          fmt.Printf(“- plst is long enough”)     }}
empty interfacetype specialString stringvar whatIsThis specialString = "hello"...testFunc := func(any interface{}) {     switch v := any.(type) {     case string: fmt.Prinf("any %v is a string type", v)     case specialString: fmt.Printf("a specialString type")     ...     }}...var ai AbsInterface              // declares method Abs()type SqrInterface interface { Sqr() float }var si SqrInterfacepp := new(Point)                 // implement AbsInterface & SqrInterfacevar empty interface{}empty = pp;ai = empty.(AbsInterface)si = ai.(SqrInterface)empty = si;

reflect

var x float64 = 3.4fmt.Println(“type:”, reflect.TypeOf(x))   // type: float64v := reflect.ValueOf(x)fmt.Println(“value:”, v)                  // value: <float64 Value>fmt.Println(“type:”, v.Type())            // type: float64fmt.Println(“kind:”, v.Kind())            // kind: float64fmt.Println(“value:”, v.Float())          // value: 3.4fmt.Println(v.Interface())                // 3.4y := v.Interface().(float64)fmt.Println(y)                            // 3.4
reflect.ValueOf(x)v = reflect.ValueOf(&x)v. CanSet()v.SetFloat(3.1415)...t := T{23, "skidoo"}s := reflect.ValueOf(&t).Elem()s.NumField()s.Field(0)

例子節選

for i:= 0; i < 10; i++ {     a := rand.Int()     fmt.Printf(“%d\n”, a)}for I := 0; i < 5; i++ {     r := rand.Int(8)     fmt.Printf(“%d\n”, r)}fmt.Println()timens := int64(time.Now().Nanosecond())rand.Seed(timens)fmt.Printf(“r2.2f\n”, 100*rand.Float32())
func typecheck(..., ..., values ... interface{}) {     for _, value := range values {         switch v := value.(type) {         case int: ...         case float: ...         case string: ...         case bool: ...         default: ...         }     }}
func Fibonacci(n int) (res int) {     if n <= 1 {         res = 1     } else {          res = fibonacci(n-1) + Fibonacci(n-2)     }     return}
// var r *bytes.Buffer = new(bytes.Buffer)var buffer bytes.Bufferfor {     if s; ok := getNextString(); ok {         buffer.WriteString(s)       // append     } else {         break     }}fmt.Print(buffer.String(), “\n”)
// var r *bytes.Buffer = new(bytes.Buffer)var buffer bytes.Bufferfor {     if s; ok := getNextString(); ok {         buffer.WriteString(s)       // append     } else {         break     }}fmt.Print(buffer.String(), "\n")
s1 := "hello"c := []byte(s1)c[0]= 'c's2 := string(c)
type Info struct {     mu sync.Mutex      // sync.RWMutex     Str string}func Update(info *Info) {     info.mu.Lock()     // info.mu.RLock()     //info.Str =  new value     info.mu.Unlock()   // info.mu.RUnlock()/Unlock()}
var once sync.OnceonceBody := func() {     fmt.Println(“Only once”)}done := make(chan bool)for i := 0; i < 10; i++ {    go func() {        once.Do(onceBody)        done <- true    }()}for i := 0; i < 10; i++ {    <-done}

Reading and Writing

fmt.Scanln(&input)fmt.Scanf("%s %s", &firstName, &lastName)fmt.Sscanf("56.12 / 5212 / Go", "%f / %d / %s", &f, &i, &s)
var inputReader *bufio.Readervar input stringvar err errorfunc main() {     inputReader = bufio.NewReader(os.Stdin)     fmt.Println("Please enter some input: ")     input, err = inputReader.ReadString('\n')    // '\n' is included!!!     if err == nil {         fmt.Printf("The input was: %s", input)     }}...switch input { case "Philip\r\n": ... }...buf := make([]byte, 1024)   n, err := inputReader.Read(buf)
// inputFile: *os.FileinputFile, inputError := os.Open("input.dat")defer inputFile.Close()inputReader := bufio.NewReader(inputFile)for {    inputString, readerError := inputReader.ReadString('\n')    ...}
import "io/ioutil"...inputFile, outputFile := "products.txt", "products_copy.txt"buf, err := ioutil.ReadFile(inputFile)if err != nil {     fmt.Fprintf(os.Stderr, "File Error: %s\n", err)}err = ioutil.WriteFile(outputFile, buf, 0x644)if err != nil {     panic(err.Error())}
file, err := os.Open("products2.txt")     // separated by space...var col1, col2, col3 []stringfor {     var v1, v2, v3 string     _, err := fmt.Fscanln(file, &v1, &v2, &v3)     ...}col1 = append(col1, v1)...
import "compress/gzip"...var r *bufio.Readerfi, err := os.Open("MyFile.gz")if err != nil {     fmt.Fprintf(...)     os.Exit(1)}fz, err := gzip.NewReader(fi)if err != nil {     r = bufio.NewReader(fi)} else {     r = bufio.NewReader(fz)}for  {     line, err := r.ReadString('\n')     ...}...import "io"...src, _ := os.Open(srcName)...dst, _ := os.OpenFile(...)io.Copy(dst, src)
outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666)outputWriter := bufio.NewWriter(outputFile)outputWriter.WriteString(outputString)outputWriter.Flush()
os.Stdout.WriteString("hello, world\n")f, _ := os.OpenFile("test", os.O_CREATE|os.O_WRONLY, 0)f.WriteString("hello, world in a file\n")     // not buffered

reading arguments from the cmd-line

who := "Alice"if len(os.Args) > 1 {     who += strings.Join(os.Args[1:], " ")}fmt.Println("Good Morning", who)
import "flag"...var NewLine = flag.Bool(“n”, false, “print on newline”)...flag.PrintDefaults()flag.Parse()var s string = ""for i := 0; i < flag.NArg(); i++ {     s += flag.Arg(i)     if *NewLine {         s += "\n"     } else {         s += " "     }}        // a.out –n A B C

json dataformat

type Address struct {     Type string     City string     Country string}...pa := Address{"private", "Aartselaar", "Belgium"}js, _ := json.Marshal(pa)   // json.MarshalForHTML(pa)...file, _ := os.OpenFile("vcard.json", os.O_CREATE|os.O...)enc := json.NewEncoder(file)err := enc.Encode(vc)
b = []byte({"Name": "Wednesday", "Age": 6, "Parents": ["Gomez", "Morticia"]})var f interface{}err := json.Unmarshal(b, &f)map[string]interface{}{          // f     "Name": "Wednesday",     "Age": 6     "Parents": []interface{}{         "Gomez",         "Morticia",     },}
func Unmarshal(data []byte, v interface{})type FamilyMember struct {     Name string     Age int     Parents []string}var m FamilyMembererr := json.Unmarshal(b, &m)
func NewDecoder(r io.Reader) *Decoderfunc NewEncoder(w io.Writer) *Encoderfunc (dec *Decoder) Decode(v interface{}) error

xml dataformat

var t, token xml.Tokenvar err errorfunc main() {     input := "<Person><FirstName>Laura</FirstName>"     input += "<LastName>Lynn</LastName></Person>"     inputReader := strings.NewReader(input)     p := xml.NewParser(inputReader)     for t, err = p.Token(); err == nil; t, err = p.Token() {          switch token := t.(type) {          case xml.StartElement:               name := token.Name.Local               fmt.Printf("Token name: %s\n", name)               for _, attr := range token.Attr {                    attrName := attr.Name.Local                    attrValue := attr.Value                    fmt.Printf(“attribute: %s %s\n”, attrName, attrValue)                    // ...               }          case xml.EndElement:               fmt.Println("End of token")          case xml.CharData:               content := string([]byte(token))               fmt.Printf("The content: %v\n", content)               // ...          default: // ...          }     }}

Cryptography

  • package hash:      adler32, crc32, crc64 and fnv

  • package crypto:    md4, md5, sha1, aes, blowfish, rc4, rsa, xtea

hasher := sha1.New()io.WriteString(hasher, "test")b := []byte{}fmt.Printf("Result: %x\n", hasher.Sum(b))hasher.Reset()data := []byte("We shall overcome!")n, err := hasher.Write(data)if n != len(data) || err != nil {     log.Printf("Hash write error: %v / %v", n, err)}checksum := hasher.Sum(b)fmt.Printf("Result: %x\n", checksum)


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.