2009-11-25 35 views
7

我习惯了Java的String,我们可以传递null而不是“”来表示特殊的含义,比如使用默认值如何在Go中有一个带有空字符串参数的函数?

在Go中,string是一个原始类型,所以我无法将nil(null)传递给需要字符串的参数。

我可以使用指针类型,像这样写的函数:

func f(s *string) 

所以调用者可以调用该函数既可以作为

f(nil) 

// not so elegant 
temp := "hello"; 
f(&temp) 

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

// elegant but disallowed 
f(&"hello"); 

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

+0

我相信你需要放手Java,并习惯Go方式。为什么你需要传递一个零而不是一个字符串?你想达到什么目的? PS。你也可以使用fmt。Printf(* new(string)) - 字符串类型为'0' – 2012-08-17 14:18:46

回答

1

不是真的参加答案:但是在结构中翘曲的价值可以提供一些通用的实用方法。 (Haskell Maybe?)

//#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); 
} 
4

我想一些更多关于我会如何使用struct实现。以下是我想出了:

type MyString struct { 
    val string; 
} 

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

然后就可以调用f这样的:

f(nil); 
f(MyString{"not a default"}); 
+1

@DaveC谢谢你最后批评我六岁的答案,从Go不到一周前的时候开始。我担心我们正在开发一种考虑到提供旧答案的背景下的文化。 – 2015-08-25 20:36:38

+0

问题来到最近活动列表的顶部,我查看答案并看到这个不正确的答案。我添加了评论,这样其他人就不会浪费时间尝试这种提案式的非解决方案。这个日期是无关紧要的。 (国际海事组织,而不是snarky你应该删除或编辑你对这个问题的猜测和不正确的答案)。 – 2015-08-25 23:33:25

+0

您对这个问题的答案留下的每一条评论都是无稽之谈,并且毫无帮助。这种说法如何在没有提出解决方案的情况下指出问题?也许你应该考虑推荐对现有答案进行编辑,或者留下你自己的答案。 (对于后代/背景,DaveC留下了一条评论,批评我的“答案”[他的引述],但没有建议如何改进)。 – 2015-08-26 13:42:27

-3

宽松的Java的思考,只是通过F( “”)。然后测试使用LEN():{如果len (STR)> 0 {... } 否则{ ... } }

FUNC F(STR字符串)

要么串是空的,并且具有你无情况的语义,或者有一些字符串数据要处理。无法看到这个问题。

+5

问题是,你可能有空字符串作为普通参数,不意味着“默认”。你的建议是“带内信号”(如使用0或-1作为整数),并被广泛认为是一个坏主意,因为你可能需要“特殊”的值来表示一般意义。 – bortzmeyer 2010-01-15 08:35:03

2

我知道我对这个派对超级迟到,但是我在寻找类似问题时发现了这个问题,并且认为我会为后代添加解决方案。

根据您的使用情况,使用variadic function可能是您的朋友。这可以让你输入零个或多个相同类型的参数给一个函数,它们在函数中作为一个数组接收。

// My variadic function 
func f(s string...) { 
    if length(s) == 0 { 
    // We got a NULL 
    fmt.Println("default value") 
    } else { 
    // We got a value 
    fmt.Println(s[0]) 
    } 
} 

f() // works! 
f("has a value") // works! 

此解决方案要求,你知道你将要传递的开发时间为零;你不能只打电话f(nil),并让它工作。但是,如果这在您的特定用例中不是问题,那么它可能是一个非常优雅的解决方案,不需要您定义任何其他数据类型。

+0

这并不完美,因为来电者不知道他们不应该/不能做像'f(“what”,“about”,“this”)这样的东西。更不用说只能使用'...'作为最后一个参数,并且这是对该功能的误用。 – 2015-08-24 21:16:48

相关问题