1. 程式人生 > >Go各種型別轉換及函式的高階用法

Go各種型別轉換及函式的高階用法

golang是強型別語言,在應用過程中型別轉換基本都會用到。下面整理一下常用的型別轉換,會持續更新。

整形轉字串

fmt.Println(strconv.Itoa(100))

該方法的原始碼是:

// Itoa is shorthand for FormatInt(i, 10).
func Itoa(i int) string {
	return FormatInt(int64(i), 10)
}

可以看出是FormatInt方法的簡單實現。

字串轉整形

i, _ := strconv.Atoi("100")
fmt.Println(i)

64位整形轉字串

var i int64
i = 0x100
fmt.Println(strconv.FormatInt(i, 10))

FormatInt第二個引數表示進位制,10表示十進位制。

位元組轉32位整形

b := []byte{0x00, 0x00, 0x03, 0xe8}
bytesBuffer := bytes.NewBuffer(b)

var x int32
binary.Read(bytesBuffer, binary.BigEndian, &x)
fmt.Println(x)

其中binary.BigEndian表示位元組序,相應的還有little endian。通俗的說法叫大端、小端。

32位整形轉位元組

var x int32
x = 106
bytesBuffer := bytes.NewBuffer([]byte{})
binary.Write(bytesBuffer, binary.BigEndian, x)
fmt.Println(bytesBuffer.Bytes())

位元組轉字串

fmt.Println(string([]byte{97, 98, 99, 100}))

字串轉位元組

fmt.Println([]byte("abcd"))

變參及匿名的用法:

/**
 * Created by Administrator on 13-12-18.
 */
package main

import (
	"fmt"
	"os"
)

func f1(args ...interface {}) {
	f2(args...)
	f2(args[1:]...)
}

func f2(args ...interface {}) {
	for i, v := range args {
		fmt.Fprintf(os.Stdout, "i = %d %v\n", i, v)
	}
	fmt.Fprintf(os.Stdout, "--------------\n")
}

func main() {
	f1(1, "hello", 3.14, main)

	// 匿名函式 1
	f := func(i, j int) (result int) { // f 為函式地址
		result = i+j
		return
	}

	fmt.Fprintf(os.Stdout, "f = %v  f(1,3) = %v\n", f, f(1, 3))

	// 匿名函式 2
	x, y := func(i, j int) (m, n int) { // x y 為函式返回值
		return j, i
	}(1, 9) // 直接建立匿名函式並執行

	fmt.Fprintf(os.Stdout, "x = %d   y = %d\n", x, y)
}


i = 0 1
i = 1 hello
i = 2 3.14
i = 3 0x4012c0
--------------
i = 0 hello
i = 1 3.14
i = 2 0x4012c0
--------------
f = 0x401690  f(1,3) = 4
x = 9   y = 1

回撥函式的實現:

package main

import (
    "fmt"
    "strconv"
)

//宣告一個saveLog型別,這個型別其實表示一個函式定義
type saveLog func(msg string)

//這個函式的第二個引數是一個函式
//這個函式將一個字串轉換為Int型別,如果失敗了,則返回0,並輸出錯誤。
func stringToInt(s string, log saveLog) int64 {
    if value, err := strconv.ParseInt(s, 0, 0); err != nil {
        log(err.Error())
        return 0
    } else {
        return value
    }
}

//記錄日誌的函式實現
func myLog(msg string) {
    fmt.Println("Find error:", msg)
}

//在呼叫第二個stringToInt的時候會發生執行時的錯誤輸出
func main() {
    stringToInt("123", myLog)
    stringToInt("s", myLog)
}

執行結果為:

$ go build func_callback.go
$ ./func_callback
Find error: strconv.ParseInt: parsing "s": invalid syntax