如何在Go中使用可为空的字符串参数的函数?

Ran*_*ku' 11 string parameters go

我已经习惯了Java的String,我们可以传递null而不是""来表示特殊含义,例如使用默认值.

在Go中,string是基本类型,因此我无法将nil(null)传递给需要字符串的参数.

我可以使用指针类型编写函数,如下所示:

func f(s *string)
Run Code Online (Sandbox Code Playgroud)

所以调用者可以将该函数称为

f(nil)
Run Code Online (Sandbox Code Playgroud)

要么

// not so elegant
temp := "hello";
f(&temp) 
Run Code Online (Sandbox Code Playgroud)

但遗憾的是不允许以下情况:

// elegant but disallowed
f(&"hello");
Run Code Online (Sandbox Code Playgroud)

接收字符串或nil的参数的最佳方法是什么?

Bil*_* Jo 6

我想到了更多关于如何使用a来实现它的方法struct.这是我想出的:

type MyString struct {
    val string;
}

func f(s MyString) {
    if s == nil {
        s = MyString{"some default"};
    }
    //do something with s.val
}
Run Code Online (Sandbox Code Playgroud)

然后你可以f像这样打电话:

f(nil);
f(MyString{"not a default"});
Run Code Online (Sandbox Code Playgroud)

  • @DaveC感谢您在Go不到一个星期大的时候终于批评了我6岁的答案。我担心我们会开始发展一种考虑到提供旧答案的环境的文化。 (3认同)

小智 1

没有真正关注答案:但是结构中的扭曲值可以提供一些通用的实用方法。(哈斯克尔也许?)

//#maybe.go
package maybe

import "log"

type MayHaveValue struct {
 IsValue bool;
}

func (this MayHaveValue) IsJust() bool {
 return this.IsValue
}

type AString struct {
 MayHaveValue;
 Value string;
}

func String(aString string) AString {
 return AString{MayHaveValue{true}, aString}
}

var NoString AString = AString{MayHaveValue{false}, ""}

func (this AString) String() (value string) {
 if this.IsJust() == true {
  value = this.Value;
 } else {
  log.Crash("Access to non existent maybeString value");
 }
 return;
}

func (this AString) OrDefault(defaultString string) (value string) {
 if this.IsJust() {
  value = this.Value;
 } else {
  value = defaultString;
 }
 return;
}

//#main.go
package main

import "fmt"
import "maybe"

func say(canBeString maybe.AString) {
 if canBeString.IsJust() {
  fmt.Printf("Say : %v\n", canBeString.String());
 } else {
  fmt.Print("Nothing to say !\n");
 }
}

func sayMaybeNothing (canBeString maybe.AString) {
 fmt.Printf("Say : %v\n", canBeString.OrDefault("nothing"));
}

func main() {
 aString := maybe.String("hello");
 say(aString);
 sayMaybeNothing(aString);
 noString := maybe.NoString;
 say(noString);
 sayMaybeNothing(noString);
}
Run Code Online (Sandbox Code Playgroud)