在Go中,以下工作(注意一个地图的使用有一个返回,另一个有两个返回)
package main
import "fmt"
var someMap = map[string]string { "some key": "hello" }
func main() {
if value, ok := someMap["some key"]; ok {
fmt.Println(value)
}
value := someMap["some key"]
fmt.Println(value)
}
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何用自己的功能做同样的事情.是否有可能与可选的返回类似的行为map?
例如:
package main
import "fmt"
func Hello() (string, bool) {
return "hello", true
}
func main() {
if value, ok := Hello(); ok {
fmt.Println(value)
}
value := Hello()
fmt.Println(value)
}
Run Code Online (Sandbox Code Playgroud)
不会编译(由于错误multiple-value Hello() in single-value context)...有没有办法使这个语法适用于该函数Hello()?
我正在尝试编写一个模板(使用html / template),并向其传递带有附加一些方法的结构,其中许多方法返回多个值。有什么方法可以从模板中访问它们吗?我希望能够执行以下操作:
package main
import (
"fmt"
"os"
"text/template"
)
type Foo struct {
Name string
}
func (f Foo) Baz() (int, int) {
return 1, 5
}
const tmpl = `Name: {{.Name}}, Ints: {{$a, $b := .Baz}}{{$a}}, {{b}}`
func main() {
f := Foo{"Foo"}
t, err := template.New("test").Parse(tmpl)
if err != nil {
fmt.Println(err)
}
t.Execute(os.Stdout, f)
}
Run Code Online (Sandbox Code Playgroud)
但是显然这是行不通的。周围没有办法吗?
我考虑过在我的代码中创建一个匿名结构:
data := struct {
Foo
a int
b int
}{
f,
0,
0,
}
data.a, data.b = f.Baz() …Run Code Online (Sandbox Code Playgroud) 我昨天开始学习Go,到目前为止我很着迷.但我碰到了一个问题.
让我们假设函数返回多个变量(真棒功能).我应该如何仅使用第n个值而不是第一个n-1值?在示例中,我只想检查密钥是否存在于哈希映射中,但不对值进行任何操作.
var value, hasElement = myMap[key]
Run Code Online (Sandbox Code Playgroud)
我得到的错误是
main.go:15: value declared and not used
Run Code Online (Sandbox Code Playgroud)
如果我只是打印它会一切都很好,但这并不好.
在这里你可以看到这段代码:
package main
import (
"fmt"
"encoding/json"
)
func main() {
map1 := map[string]map[string]interface{}{}
map2 := map[string]interface{}{}
map2["map2item"] = "map2item"
map1["map2"] = map2
fmt.Println(string(json.Marshal(map1)))
}
Run Code Online (Sandbox Code Playgroud)
返回此错误:
tmp/sandbox100532722/main.go:13:33: multiple-value json.Marshal() in single-value context.
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
假设我有这个:
type Donut string
type Muffin string
func getPastry () (interface{}, error) {
// some logic - this is contrived
var d Donut
d = "Bavarian"
return d, nil
}
Run Code Online (Sandbox Code Playgroud)
是否可以将其减少到一行:
p, err := getPastry()
thisPastry := p.(Donut)
Run Code Online (Sandbox Code Playgroud)
换句话说,这样的东西,不编译:
thisPastry, err := getPastry().(Donut, error)
Run Code Online (Sandbox Code Playgroud)
不是有两行代码来获得"通用"并输入它是一件大事,但它对我来说只是感觉浪费和不简单,这通常意味着我错过了一些明显的东西:-)
我正在使用HID驱动程序,该驱动程序将[]byte一些不同报告之一读入缓冲区。当我使用时hex.EncodeToString(buffer),它将返回一个类似于0000or或0100or 的字符串0200,我想使用开关根据HID设备的输入进行检查,因此我想在之外预先定义这些可能性,main()我应该如何确定?继续?
我尝试了以下可能性:
var LEFT []byte = []byte('0000')
// or
var LEFT []byte = `0000`
// or
var LEFT []byte = '0000'
// or
var LEFT []byte = '\x00\x00' // from the %q Printf verb
Run Code Online (Sandbox Code Playgroud)
另一种方法是hex.DecodeString("0000")在main()函数中调用。
编辑
关于提供的解决方案的注释,EncodeToString十六进制0000或0100不是四个字节,而是两个:
"\x01"== "01"=='1'
因此我可以按照建议使用0100或0200:
var LEFT []byte{1,0}
// or
var LEFT []byte("\x01\x00")
Run Code Online (Sandbox Code Playgroud) 我有一个go函数,它返回两个整数值.以下是功能
func temp() (int, int){
return 1,1
}
Run Code Online (Sandbox Code Playgroud)
是否可以将temp函数直接放入a Println并使用字符串格式打印输出,如下所示
fmt.Println("first= %d and second = %d", temp() ) // This doesn't work
Run Code Online (Sandbox Code Playgroud)
在Python中,我能够执行以下操作
def func():
return 1,1
print("{0}={1}".format(*func())
>> '1=2'
Run Code Online (Sandbox Code Playgroud)
我可以在golang做类似的东西吗?
我正在尝试在Go中初始化一个结构,我的一个值是返回一个int和一个错误,如果遇到一个字符串使用转换strconv.Atoi("val").
我的问题是:有没有办法忽略Golang中的错误返回值?
ts := &student{
name: td[0],
ssn: td[2],
next: students.next,
age: strconv.Atoi(td[1]),
}
Run Code Online (Sandbox Code Playgroud)
这给出了错误
multiple-value strconv.Atoi() in single-value context
Run Code Online (Sandbox Code Playgroud)
如果我添加了错误,我不想包含在我的结构中,我将得到一个错误,我正在使用未在结构中定义的方法.
我需要在 golang 代码中进行 http 调用。我的服务器代码将创建 http 请求对象并将其放入数据库中。
工作代码将从数据库获取数据,并且应该能够使用持久请求对象进行 http 调用。
我可以通过序列化http请求直接将请求对象持久化到数据库中还是需要在数据库中单独添加method/URL/body?
我有以下代码:
var i2 uint64;
var err error;
i2, err = uint64(strconv.ParseInt(scanner.Text(), 64, 64));
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
multiple-value strconv.ParseInt() in single-value context
Run Code Online (Sandbox Code Playgroud)
根据我在互联网上找到的所有内容,这意味着我忽略了ParseInt返回的两个参数,但我使用的是错误的.我知道也许错误是非常愚蠢的,但我刚开始学习Go,这让我很困惑.
假设我们有一个这样的结构:
type Data struct {
a int
}
Run Code Online (Sandbox Code Playgroud)
我们想要获取返回多个值的函数的单个返回值并将其分配给 Data 对象,例如
data := Data {
a: strconv.Atoi("1000")
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,因为 Atoi 返回两个值,一个数字和一个错误,所以我们需要以某种方式处理额外的值(错误),但就我而言,我不需要评估错误值,并且不可能使用_关键字将其关闭。
在初始化结构时如何实现这一点,我想摆脱错误返回值
我有一个Go程序,我只是想将字符串转换为int。我了解功能:
val, err := strconv.Atoi(myValueAsAString)
Run Code Online (Sandbox Code Playgroud)
可以,我可以通过以下检查错误:
if err != nil {
//handle error
}
Run Code Online (Sandbox Code Playgroud)
但是如果我是100%,该字符串将是一个数字,我想在if语句中将其转换为int,如下所示:
if 45 + strconv.Atoi(value) >= 90 {
//do something
}
Run Code Online (Sandbox Code Playgroud)
但是strconv.Atoi也同样会返回一个错误值,因此我该如何抛弃它并基本上执行我在上面所做的事情,而不必在if语句上方定义变量并将其在if语句中使用。我不确定这是否可行,但我很想知道。
最近,我研究了Golang可以为函数返回多个结果.所以我写了一个函数:
func store(x, y int) (int, int) {
return x + y, x - y
}
Run Code Online (Sandbox Code Playgroud)
在此之后我写下面的代码:
func main() {
a, b := store(6, 4)
fmt.Println(a, b)
}
Run Code Online (Sandbox Code Playgroud)
结果是:
10 2
这工作正常.
但是如果我只想打印一个,那么我该怎么办呢?
func main() {
a, b := store(6, 4)
fmt.Println(a)
}
Run Code Online (Sandbox Code Playgroud)
结果:
tmp/sandbox683412938/main.go:12:19:b声明并且未使用
另外,为什么我不能写:
func main() {
a := store(6, 4) // ???
fmt.Println(a)
}
Run Code Online (Sandbox Code Playgroud)
请指导我.