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

golang給函數(shù)參數(shù)設置默認值的幾種方式小結(函數(shù)參數(shù)默認值

 更新時間:2023年01月06日 13:14:22   作者:學亮編程手記  
在日常開發(fā)中我們有時候需要使用默認設置,下面這篇文章主要給大家介紹了關于golang給函數(shù)參數(shù)設置默認值的幾種方式小結的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

這個問題相當麻煩,根據(jù)golang-nuts/google groups中的這篇文章,golang現(xiàn)在與將來都不會支持參數(shù)默認值。Go始終在使得自己變得盡可能的簡單,而增加這種額外的支持會使parser變得更復雜。

設置參數(shù)值的好處:

  • 可以缺省部分參數(shù)。
  • 可以提供一種默認的,行之有效的配置。

但是參考資料中提到了幾種實現(xiàn)默認值的方法:

強制改變

// Both parameters are optional, use empty string for default value
func Concat1(a string, b int) string {
  if a == "" {
    a = "default-a"
  }
  if b == 0 {
    b = 5
  }
 
  return fmt.Sprintf("%s%d", a, b)
}

go的一大特點就是所有的變量都必須經過初始化。那如果在函數(shù)內部讀取到參數(shù)值為初始化值,即可進行對應的操作。 但是這種方法無法解決設置參數(shù)默認值時所經常應對的場景,即參數(shù)缺省問題。

使用可變參數(shù)語法糖

// a is required, b is optional.
// Only the first value in b_optional will be used.
func Concat2(a string, b_optional ...int) string {
  b := 5
  if len(b_optional) > 0 {
    b = b_optional[0]
  }
 
  return fmt.Sprintf("%s%d", a, b)
}

上述方法中,a是必須的,而b是可選的。 此時b的默認值時5,如果b_optional中存在數(shù)據(jù),則將其讀取。

利用結構體的config

// A declarative default value syntax
// Empty values will be replaced with defaults
type Parameters struct {
  A string `default:"default-a"` // this only works with strings
  B string // default is 5
}
 
func Concat3(prm Parameters) string {
  typ := reflect.TypeOf(prm)
 
  if prm.A == "" {
    f, _ := typ.FieldByName("A")
    prm.A = f.Tag.Get("default")
  }
 
  if prm.B == 0 {
    prm.B = 5
  }
 
  return fmt.Sprintf("%s%d", prm.A, prm.B)
}

雖然也能做到缺省參數(shù)(如果不設置A屬性,則該屬性將被默認初始化),但是這種方式只對字符串管用。

轉換函數(shù)的全部參數(shù)

func Concat4(args ...interface{}) string {
  a := "default-a"
  b := 5
 
  for _, arg := range args {
    switch t := arg.(type) {
      case string:
        a = t
      case int:
        b = t
      default:
        panic("Unknown argument")
    }
  }
 
  return fmt.Sprintf("%s%d", a, b)
}

相當泛用的方法,但是對于不同的類型就不可行了。

補充知識:Golang中設置函數(shù)默認參數(shù)的優(yōu)雅實現(xiàn)

在Golang中,我們經常碰到要設置一個函數(shù)的默認值,或者說我定義了參數(shù)值,但是又不想傳遞值,這個在python或php一類的語言中很好實現(xiàn),但Golang中好像這種方法又不行。今天在看Grpc源碼時,發(fā)現(xiàn)了一個方法可以很優(yōu)雅的實現(xiàn),叫做 Functional Options Patter.通過定義函數(shù)的方式來實現(xiàn)

比如我們以如下的構造函數(shù)為例說明下,用這個的好處

func NewClient(address string,timeout,trynums int){}

如果我們要實例化這個函數(shù),timeout,trynums這個是必須要傳的,那如果我不想傳呢,一般可能是通過傳對象(struct,map)或定義多個func,感覺都不太方便。

func NewClient(address string){}
func NewClientNoTimeout(address string,trynums int){}

另一種傳一個對象

type Options struct{
    timeout int,
    trynums int
}
func NewClient(address string,opts Options){}

用對象的形式,還得檢查參數(shù)的合法性。比如傳遞了不存在的參數(shù)等。

那么,我們看下用Functional Options Patter的方式,我寫了一個簡單的例子。

package main
 
import "fmt"
 
//如何向func傳遞默認值
 
type dialOption struct {
    Username string
    Password string
    Service  string
}
 
type DialOption interface {
    apply(*dialOption)
}
 
 
type funcOption struct {
    f func(*dialOption)
}
 
func(fdo *funcOption) apply(do *dialOption){
     fdo.f(do)
}
 
 
func newFuncOption(f func(*dialOption))*funcOption{
    return &funcOption{
        f:f,
    }
}
 
func withUserName(s string) DialOption{
    return  newFuncOption(func(o *dialOption){
        o.Username = s
    })
}
 
func withPasswordd(s string) DialOption{
    return  newFuncOption(func(o *dialOption){
        o.Password = s
    })
}
 
func withService(s string) DialOption{
    return  newFuncOption(func(o *dialOption){
        o.Service = s
    })
}
 
//默認參數(shù)
func defaultOptions() dialOption{
    return dialOption{
        Service:"test",
    }
}
 
type clientConn struct {
    timeout int
    dopts dialOption
}
 
 
func NewClient(address string, opts ...DialOption){
    cc :=&clientConn{
        timeout:30,
        dopts:defaultOptions(),
    }
    //循環(huán)調用opts
    for _,opt := range opts {
        opt.apply(&cc.dopts)
    }
 
    fmt.Printf("%+v",cc.dopts)
}
 
 
func main(){
    NewClient("127.0.0.1",withPasswordd("654321"),withService("habox"))
    NewClient("127.0.0.1",withService("habox"))
}

實例化時,通過func的方式來傳遞參數(shù),也可以定義一些默認參數(shù)。如果以后要加,只需要更改很少的代碼。

而且,這種方式也不會傳遞不相關的參數(shù),因為參數(shù)都在通過func的方式來修改的。

唯一不好的地方可能是代碼量相應的增加了。但是為了更優(yōu)雅,這種做法還是值得的。

總結

到此這篇關于golang給函數(shù)參數(shù)設置默認值的文章就介紹到這了,更多相關golang函數(shù)參數(shù)設置默認值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析Go語言容器之數(shù)組和切片的使用

    淺析Go語言容器之數(shù)組和切片的使用

    在?Java?的核心庫中,集合框架可謂鼎鼎大名:Array?、List、Set等等,隨便拎一個出來都值得開發(fā)者好好學習如何使用甚至是背后的設計源碼。雖然Go語言沒有如此豐富的容器類型,但也有一些基本的容器供開發(fā)者使用,接下來讓我們認識一下這些容器類型吧
    2022-11-11
  • go mod私有倉庫配置小結

    go mod私有倉庫配置小結

    Go語言私有倉庫通常指的是那些不在公共倉庫如GitHub上的倉庫,本文主要介紹了go mod私有倉庫配置,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • go gin中間件關于 c.next()、c.abort()和return的使用小結

    go gin中間件關于 c.next()、c.abort()和return的使用小結

    中間件的執(zhí)行順序是按照注冊順序執(zhí)行的,中間件可以通過 c.abort() + retrurn 來中止當前中間件,后續(xù)中間件和處理器的處理流程,?這篇文章給大家介紹go gin中間件關于 c.next()、c.abort()和return的使用小結,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Golang開發(fā)之字符串與切片問題踩坑記錄

    Golang開發(fā)之字符串與切片問題踩坑記錄

    字符串和切片,都是golang常用的兩種內置數(shù)據(jù)類型,最近在日常工作中,遇到了一個字符串切片導致的問題,記錄一下排查問題的過程,避免后續(xù)在這種場景上踩坑
    2023-07-07
  • 使用go進行云存儲上傳實現(xiàn)實例

    使用go進行云存儲上傳實現(xiàn)實例

    這篇文章主要為大家介紹了使用go進行云存儲上傳實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2024-01-01
  • golang xorm及time.Time自定義解決json日期格式的問題

    golang xorm及time.Time自定義解決json日期格式的問題

    這篇文章主要介紹了golang xorm及time.Time自定義解決json日期格式的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang?beego框架環(huán)境搭建過程

    golang?beego框架環(huán)境搭建過程

    這篇文章主要為大家介紹了golang?beego框架環(huán)境搭建的過程腳本,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Go語言開發(fā)保證并發(fā)安全實例詳解

    Go語言開發(fā)保證并發(fā)安全實例詳解

    這篇文章主要為大家介紹了Go語言開發(fā)保證并發(fā)安全實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Go gRPC環(huán)境安裝教程示例詳解

    Go gRPC環(huán)境安裝教程示例詳解

    這篇文章主要為大家介紹了Go gRPC環(huán)境安裝的教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 手把手帶你走進Go語言之運算符解析

    手把手帶你走進Go語言之運算符解析

    這篇文章主要介紹了手Go語言之運算符解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09

最新評論

策勒县| 西充县| 长兴县| 孙吴县| 喀喇沁旗| 虞城县| 尼玛县| 巴马| 原平市| 资兴市| 秭归县| 安义县| 嫩江县| 元阳县| 博白县| 松江区| 黄大仙区| 杂多县| 筠连县| 林西县| 岚皋县| 凤山县| 新绛县| 宁乡县| 吉木萨尔县| 义马市| 福海县| 卫辉市| 姚安县| 黄骅市| 永嘉县| 开封市| 长顺县| 纳雍县| 保德县| 龙井市| 嘉禾县| 孟津县| 莱州市| 缙云县| 沅江市|