14

私は Java の String に慣れており、デフォルト値を使用するなどの特別な意味で "" ではなく null を渡すことができます。

Go では文字列はプリミティブ型なので、文字列を必要とするパラメータに nil (ヌル) を渡すことはできません。

次のように、ポインター型を使用して関数を作成できます。

func f(s *string)

そのため、呼び出し元はその関数を次のいずれかとして呼び出すことができます

f(nil)

また

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

ただし、残念ながら次のことは許可されていません。

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

文字列または nil のいずれかを受け取るパラメーターを持つ最良の方法は何ですか?

4

5 に答える 5

5

警告:以下はGo1以前のコードです。つまり、プレリリースバージョンのものであり、有効なGoコードではありません。

を使用してこれを実装する方法についてもう少し考えました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"});
于 2009-11-27T00:56:30.837 に答える
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);
}
于 2009-11-26T10:20:50.967 に答える
-4

Java の考え方を緩めて、f("") を渡すだけです。次に、len() を使用してテストします。

func f(str string) { if len(str) > 0 { ... } else { ... } }

文字列が空で、nil ケースのセマンティックな意味を持っているか、処理する文字列データがあります。その問題は見えません。

于 2010-01-15T06:01:21.693 に答える