Go語言 可變參數(變參函數)


  合適地使用可變參數,可以讓代碼簡單易用,尤其是輸入輸出類函數,比如日志函數等。

  本文主要從4個實例介紹可變參數用法。

  程序代碼:

package main

import (
    "bytes"
    "fmt"
)

/****************** 1 ****************
定義可參變數函數
形如...type格式的類型只能作為函數的參數類型存在,
並且必須是最后一個參數,它是一個語法糖(syntactic sugar),
即這種語法對語言的功能並沒有影響,但是更方便程序員使用,
通常來說,使用語法糖能夠增加程序的可讀性,從而減少程序出錯的可能
*/
func myfunc(args ...int) {
    for _, v := range args {
        fmt.Println(v)
    }
}

/****************** 2 ****************
任意類型的可變參數
用 interface{} 傳遞任意類型數據是Go語言的慣例用法,使用 interface{} 仍然是類型安全的
*/
func MyPrintf(args ...interface{}) {
    for _, arg := range args {
        switch arg.(type) {
        case int:
            fmt.Println(arg, "is an int value.")
        case string:
            fmt.Println(arg, "is an string value.")
        case int64:
            fmt.Println(arg, "is an int64 value.")
        default:
            fmt.Println(arg, "is an unknown value.")
        }

    }
}

/****************** 3 ****************
遍歷可變參數列表——獲取每一個參數的值
*/
func JoinStrings(slist ...string) string {
    //定義 一個字節緩沖,快速連接字符串
    var b bytes.Buffer
    for _, s := range slist {
        //將遍歷的字節字符串寫入字節數組
        b.WriteString(s)

    }
    //將連接好的字節數組轉為字符串
    return b.String()
}

func rawPrint(slst ...interface{}) {
    for _, v := range slst {
        fmt.Println(v)
    }
}

/****************** 4 ****************
在多個可變參數函數中傳遞參數
如果要將這個含有可變參數的變量傳遞給下一個可變參數函數,可以在傳遞時給可變參數變量后面添加...
*/
func personPrint(slst ...interface{}) {
    rawPrint(slst...)
}

func main() {

    //定義可參變數函數
    myfunc(1, 7, 5)

    var v1 int = 1
    var v2 int64 = 234
    var v3 string = "hello"
    var v4 float32 = 1.23
    //任意類型的可變參數
    MyPrintf(v1, v2, v3, v4)
    //遍歷可變參數列表——獲取每一個參數的值
    fmt.Println(JoinStrings("ladies ", "and ", "gentlemen"))
    //在多個可變參數函數中傳遞參數
    personPrint(1, 3, 5)
}

 

  程序輸出:

1
7
5
1 is an int value.
234 is an int64 value.
hello is an string value.
1.23 is an unknown value.
ladies and gentlemen
1
3
5

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM