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的参数的最佳方法是什么?
我想到了更多关于如何使用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)
小智 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)
| 归档时间: |
|
| 查看次数: |
4103 次 |
| 最近记录: |