最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go 變長參數(shù)函數(shù)的實現(xiàn)示例

 更新時間:2026年04月14日 09:04:41   作者:Go_error  
本文主要介紹了Go語言中的變長參數(shù)的類型、聲明、調(diào)用以及其在實際開發(fā)中的應(yīng)用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1. 變長參數(shù)和變長參數(shù)函數(shù)類型

  • 一個函數(shù)的最后一個參數(shù)可以是一個變長參數(shù);
  • 一個函數(shù)可以最多有一個變長參數(shù);
  • 一個變長參數(shù)的類型總為一個切片類型。

變長參數(shù)在聲明的時候必須在它的(切片)類型的元素類型前面前置三個點 ...,以示這是一個變長參數(shù)。 兩個變長函數(shù)類型的例子:

func (values ...int64) (sum int64) 
func (sep string, tokens ...string) string

2. 變長參數(shù)函數(shù)的聲明

變長函數(shù)聲明和普通函數(shù)聲明類似,只不過最后一個參數(shù)必須為變長參數(shù)。一個變長參數(shù)在函數(shù)體內(nèi)將被視為一個切片。

func Sum(values ...int64) (sum int64) {
 // values的類型為[]int64
 sum = 0
 for _, v := range values {
  sum += v
 }
 return
}

func Concat(sep string, tokens ...string) (r string) {
 // tokens的類型為[]string
 for i, t := range tokens {
  if i != 0 {
   r += sep
  }
  r += t
 }
 return r
}

從上面的兩個變長參數(shù)函數(shù)聲明可以看出,如果一個變長參數(shù)的類型部分為 ...T,則此變長參數(shù)的類型實際為 []T。

事實上,fmt 標準庫包中的 Print、Println 和 Printf 函數(shù)均為變長參數(shù)函數(shù)。它們的聲明大致如下:

func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)

3. 變長參數(shù)函數(shù)調(diào)用

在變長參數(shù)函數(shù)調(diào)用中,可以使用兩種風格的方式將實參傳遞給類型為 []T 的變長形參:

1.傳遞一個切片做為實參。此切片必須可以被賦值給類型為 []T 的值(或者說此切片可以被隱式轉(zhuǎn)換為類型 []T)。此實參切片后必須跟隨三個點 ...。

2.傳遞零個或者多個可以被隱式轉(zhuǎn)換為 T 的實參(或者說這些實參可以賦值給類型為 T 的值)。 這些實參將被添加入一個匿名的在運行時刻創(chuàng)建的類型為 []T 的切片中,然后此切片將被傳遞給此函數(shù)調(diào)用。

注意,這兩種風格的方式不可在同一個變長參數(shù)函數(shù)調(diào)用中混用。

下面這個例子展示了一些變長參數(shù)函數(shù)調(diào)用:

package main

import "fmt"

func Sum(values ...int64) (sum int64) {
 sum = 0
 for _, v := range values {
  sum += v
 }
 return
}

func main() {
 a0 := Sum()
 a1 := Sum(2)
 a3 := Sum(2, 3, 5)
 // 上面三行和下面三行是等價的。
 b0 := Sum([]int64{}...)
 b1 := Sum([]int64{2}...)
 b3 := Sum([]int64{2, 3, 5}...)
 fmt.Println(a0, a1, a3) // 0 2 10
 fmt.Println(b0, b1, b3) // 0 2 10
}

4. 模擬實現(xiàn)函數(shù)的可選參數(shù)與默認參數(shù)

來看下 Gin 中的 Run 方法使用:

func (engine *Engine) Run(addr ...string) (err error) {
 defer func() { debugPrintError(err) }()

 address := resolveAddress(addr)
 debugPrint("Listening and serving HTTP on %s\n", address)
 err = http.ListenAndServe(address, engine)
 return
}


func resolveAddress(addr []string) string {
 switch len(addr) {
 case 0:
  if port := os.Getenv("PORT"); port != "" {
   debugPrint("Environment variable PORT="%s"", port)
   return ":" + port
  }
  debugPrint("Environment variable PORT is undefined. Using port :8080 by default")
  return ":8080"
 case 1:
  return addr[0]
 default:
  panic("too many parameters")
 }
}

5. 實現(xiàn)功能選項模式(functional option)

功能選項模式使得我們在設(shè)計和實現(xiàn)帶有配置選項的函數(shù)或方法時,更靈活優(yōu)雅:

package main
import "fmt"
type CoffeeOptions struct {
 sugar        int
 milk         int
 coffeePowder int
}
// 這個函數(shù)會接受上面結(jié)構(gòu)體 CoffeeOptions 實例的指針 這個函數(shù)最終的目的都是為了修改實例
type CoffeeOption func(*CoffeeOptions)
// 下面這三個函數(shù)都會返回 CoffeeOption 函數(shù) 方便修改 CoffeeOptions 結(jié)構(gòu)體
func CoffeeSugar(sugar int) CoffeeOption {
 return func(opts *CoffeeOptions) {
  opts.sugar = sugar
 }
}
func CoffeeMilk(milk int) CoffeeOption {
 return func(opts *CoffeeOptions) {
  opts.milk = milk
 }
}
func CoffeePowder(coffeePowder int) CoffeeOption {
 return func(opts *CoffeeOptions) {
  opts.coffeePowder = coffeePowder
 }
}
func newDefaultCoffeeOptions() *CoffeeOptions {
 return &CoffeeOptions{
  sugar:        5,
  milk:         0,
  coffeePowder: 60,
 }
}
func NewCoffee(opts ...CoffeeOption) *CoffeeOptions {
 // 新建實例opt
 defaultOptions := newDefaultCoffeeOptions()
 // 根據(jù)所傳的參數(shù)修改opt實例
 for _, o := range opts {
  o(defaultOptions)
 }
 return defaultOptions
}
func main() {
 // 創(chuàng)建函數(shù)來修改實例
 opts := NewCoffee(
  CoffeeSugar(10),
  CoffeeMilk(10),
  CoffeePowder(80),
 )
 fmt.Printf("%#v", *opts)
 // main.CoffeeOptions{sugar:10, milk:10, coffeePowder:80}
}

go-micro 中你可以看到很多 functional option 的應(yīng)用,基本每個 micro 組件都使用了這種方式進行構(gòu)造。

到此這篇關(guān)于Go 變長參數(shù)函數(shù)的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go 變長參數(shù)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang errors包快速上手

    Golang errors包快速上手

    errors 包是用于處理錯誤的標準庫, errors 包提供的功能比較簡單,使用起來非常方便,下面就來介紹一下,感興趣的可以了解一下
    2025-05-05
  • Golang標準庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例

    Golang標準庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例

    這篇文章主要為大家介紹了Golang標準庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Go實現(xiàn)短url項目的方法示例

    Go實現(xiàn)短url項目的方法示例

    這篇文章主要介紹了Go實現(xiàn)短url項目的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • go語言工程結(jié)構(gòu)

    go語言工程結(jié)構(gòu)

    這篇文章主要簡單介紹了go語言工程結(jié)構(gòu),對于我們學習go語言很有幫助,需要的朋友可以參考下
    2015-01-01
  • Go中獲取兩個切片交集的六種實現(xiàn)方式

    Go中獲取兩個切片交集的六種實現(xiàn)方式

    在Go開發(fā)中,切片交集(Intersection) 是高頻需求:用戶標簽匹配、權(quán)限校驗、數(shù)據(jù)去重同步,本文系統(tǒng)梳理從基礎(chǔ)到高階的 6 種實現(xiàn)方式,含泛型、結(jié)構(gòu)體、去重、性能對比,助你寫出工業(yè)級健壯代碼,需要的朋友可以參考下
    2025-12-12
  • Go語言Gin框架前后端分離項目開發(fā)實例

    Go語言Gin框架前后端分離項目開發(fā)實例

    本文主要介紹了Go語言Gin框架前后端分離項目開發(fā)工程化實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11
  • Golang排列組合算法問題之全排列實現(xiàn)方法

    Golang排列組合算法問題之全排列實現(xiàn)方法

    這篇文章主要介紹了Golang排列組合算法問題之全排列實現(xiàn)方法,涉及Go語言針對字符串的遍歷及排列組合相關(guān)操作技巧,需要的朋友可以參考下
    2017-01-01
  • go語言csrf庫使用實現(xiàn)原理示例解析

    go語言csrf庫使用實現(xiàn)原理示例解析

    這篇文章主要為大家介紹了go語言csrf庫使用實現(xiàn)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 關(guān)于golang?struct?中的?slice?無法原子賦值的問題

    關(guān)于golang?struct?中的?slice?無法原子賦值的問題

    這篇文章主要介紹了為什么?golang?struct?中的?slice?無法原子賦值的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • 一文帶你全面掌握Go語言中的正則表達式

    一文帶你全面掌握Go語言中的正則表達式

    正則表達式是一種強大的模式匹配工具,能夠在文本中進行靈活的搜索和替換操作,本文將介紹?Golang?中的正則表達式語法,包括常用的匹配符號、模式修飾符以及示例應(yīng)用,希望對大家有所幫助
    2023-05-05

最新評論

兴业县| 庐江县| 栾川县| 鹿邑县| 阜宁县| 宣威市| 西峡县| 红桥区| 平果县| 中西区| 涟源市| 阳城县| 英山县| 松桃| 林芝县| 蒲江县| 兰西县| 许昌县| 谢通门县| 祁门县| 商城县| 揭阳市| 突泉县| 伊金霍洛旗| 原阳县| 惠州市| 乐业县| 佛冈县| 鲁山县| 蒙城县| 北安市| 天津市| 阿拉善盟| 四子王旗| 无极县| 平罗县| 靖西县| 百色市| 万安县| 缙云县| 宁陕县|