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

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

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

前言

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

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

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

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

強(qiáng)制改變

// 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的一大特點(diǎn)就是所有的變量都必須經(jīng)過初始化。那如果在函數(shù)內(nèi)部讀取到參數(shù)值為初始化值,即可進(jìn)行對(duì)應(yīng)的操作。 但是這種方法無法解決設(shè)置參數(shù)默認(rèn)值時(shí)所經(jīng)常應(yīng)對(duì)的場(chǎng)景,即參數(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是可選的。 此時(shí)b的默認(rèn)值時(shí)5,如果b_optional中存在數(shù)據(jù),則將其讀取。

利用結(jié)構(gòu)體的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ù)(如果不設(shè)置A屬性,則該屬性將被默認(rèn)初始化),但是這種方式只對(duì)字符串管用。

轉(zhuǎn)換函數(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)
}

相當(dāng)泛用的方法,但是對(duì)于不同的類型就不可行了。

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

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

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

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

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

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

另一種傳一個(gè)對(duì)象

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

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

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

package main
 
import "fmt"
 
//如何向func傳遞默認(rèn)值
 
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
    })
}
 
//默認(rèn)參數(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)調(diào)用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"))
}

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

而且,這種方式也不會(huì)傳遞不相關(guān)的參數(shù),因?yàn)閰?shù)都在通過func的方式來修改的。

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

總結(jié)

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

相關(guān)文章

  • 淺析Go語言容器之?dāng)?shù)組和切片的使用

    淺析Go語言容器之?dāng)?shù)組和切片的使用

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

    go mod私有倉庫配置小結(jié)

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

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

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

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

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

    使用go進(jìn)行云存儲(chǔ)上傳實(shí)現(xiàn)實(shí)例

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

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

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

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

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

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

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

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

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

    手把手帶你走進(jìn)Go語言之運(yùn)算符解析

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

最新評(píng)論

射阳县| 天镇县| 通州区| 定陶县| 鄂州市| 大姚县| 乐昌市| 安远县| 松江区| 武安市| 九龙城区| 剑阁县| 临湘市| 伊春市| 柳林县| 太谷县| 海兴县| 浏阳市| 肥西县| 孟连| 微山县| 安徽省| 临泽县| 柳河县| 榆林市| 新干县| 泸西县| 甘南县| 温泉县| 连云港市| 西吉县| 田阳县| 六安市| 黔江区| 庆城县| 沿河| 乳山市| 辰溪县| 遵化市| 土默特右旗| 合水县|