2009-11-25 34 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

相關問題