我在Go中有一个函数如下:
func MyFunction(name, address, nick string, age, value int) {
// perform some operations
}
Run Code Online (Sandbox Code Playgroud)
我想用参数调用这个函数("Bob","New York","Builder",30,1000)但是我想在调用函数时使用字段名称.但是以下技术都没有奏效(他们抛出'未解决的参考错误'):
MyFunction(name = "Bob", address = "New York", nick = "Builder", age = 30, value = 1000)
MyFunction(name : "Bob", address : "New York", nick : "Builder", age : 30, value : 1000)
Run Code Online (Sandbox Code Playgroud)
怎么做得好?在初始化结构时使用字段名称没有问题,但是对于函数来说,我似乎缺少某些东西.
如何将Go项目成功上传到现有的github存储库?这里是我如何$ GOPATH样子:/home/user/go。
在那里,我创建了以下目录:src/github.com/StefanCepa/。在该目录中,我有2个目录,分别代表两个不同的项目。我希望将每个项目发布到单独的github存储库中。
有什么想法我该怎么做?提交用github上Go语言编写的内容对我来说有点困惑。
为什么我要执行以下操作在Go中定义迭代器:
func f() func() int {
i := 1
return func() int {
i++
return i
}
}
Run Code Online (Sandbox Code Playgroud)
但这会导致变量未使用错误(i未使用)?
func f() func() int {
i := 1
return func() (i int) {
i++
return
}
}
Run Code Online (Sandbox Code Playgroud)
主功能:
func main() {
iter := f()
fmt.Println(iter())
fmt.Println(iter())
fmt.Println(iter())
fmt.Println(iter())
}
Run Code Online (Sandbox Code Playgroud)
对我而言,这两个版本的功能完全相同:它们f用作迭代器。f利用闭包(更具体地讲i)。第一个版本i通过命名返回类型引用它来显式地返回一个增量,第二个隐式地。
对我来说,这两个版本是相同的,那么为什么会出现错误?
我想json strings用go语言反序列化。不同键的值类型不同。例如string {\"category\":\"6\",\"cid\":2511993760745787586}?category类型是string,cid类型是int64。
我的代码如下:
func main() {
oriInfo := make([]interface{}, 0)
pickled := "[{\"category\":\"6\",\"cid\":2511993760745787586},{\"category\":\"5\",\"cid\":2504429915944783937}]"
err := json.Unmarshal([]byte(pickled), &oriInfo)
if err != nil {
fmt.Println(err)
return
}
all := make([]map[string]interface{}, 0, len(oriInfo))
for _, val := range oriInfo {
m := make(map[string]interface{})
for k, v := range val.(map[string]interface{}) {
switch k {
case "category":
m[k] = v.(string)
case "cid":
m[k] = int64(v.(float64))
}
}
all = append(all, m)
} …Run Code Online (Sandbox Code Playgroud) 我正在使用“ Go编程语言”这本书学习Go。第一章介绍了os.Open用于读取文件的模块。我尝试打开如下所示的go文件。
f, err = os.Open("helloworld.go")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
# command-line-arguments
.\helloworld.go:6:6: main redeclared in this block
previous declaration at .\dup2.go:10:6
Run Code Online (Sandbox Code Playgroud)
我想了解为什么go表现得像是在尝试编译文件而不是像其他语言(Python,Java或C)一样读取。
打开文件的正确方法是什么?
我正在尝试使用基于保存在变量中的用户输入的正则表达式模式。然后该变量将用于正则表达式搜索模式。
如果 city 硬编码为正则表达式模式,以下是代码的某些部分:
//city.txt has the following input information:
//Boston 100 AA BB
//Chicago 200 CC DD
//Get user input
fmt.Print("Enter city: ")
scanner.Scan()
city:= scanner.Text()
//Read file from text and convert to string
citylist, _ := ioutil.ReadFile("city.txt")
convertcitytostring:= string(citylist)
//Use regexp to search the citylist(str)
search1:= regexp.MustCompile(`Boston\s\S.*`)
search2:= search1.FindString(convertcitytostring)
//Convert results to []string
search3:= strings.Fields(search2)
//Print
fmt.Printf("%v %T", search3, search3)
fmt.Printf("\n")
//Output:
//[Boston 100 AA BB] []string
Run Code Online (Sandbox Code Playgroud)
我想做的是使用变量“city”而不是硬编码模式:
search1:= regexp.MustCompile(`city\s\S.*`)
search2:= search1.FindString(convertSitestoString)
Run Code Online (Sandbox Code Playgroud) 我在范围循环中看到这一点以获取 MIME 标头。
for _, ext := range parseExtensions(r.Header) {
if ext[""] != "permessage-deflate" {
continue
}
compress = true
break
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码
package main
import "fmt"
func main() {
a := []int{1}
b := &a[0]
fmt.Println(a, &a[0], b, *b) // prints [1] 0xc00001c030 0xc00001c030 1
a = append(a, 1, 2, 3)
fmt.Println(a, &a[0], b, *b) // prints [1 1 2 3] 0xc000100020 0xc00001c030 1
}
Run Code Online (Sandbox Code Playgroud)
首先它创建一个 1 int 的切片。它的 len 是 1,cap 也是 1。然后我获取一个指向它的第一个元素的指针,并在 print 中获取底层指针值。正如预期的那样,它工作得很好。
然后我向切片中添加 3 个元素,从而扩展切片的容量,从而将其复制到内存中的另一个位置。之后,我打印切片第一个元素的地址(通过获取指针),该地址现在与存储在b.
但是,当我打印它的基本值时,它b也可以正常工作。我不明白为什么它有效。据我所知,第一个元素指向的切片b已复制到内存中的另一个位置,因此它之前的内存肯定已被释放。然而,它似乎仍然存在。
如果我们查看映射,golang 甚至不允许我们通过键在元素上创建指针,因为完全相同的问题 - 底层数据可以移动到内存中的另一个位置。然而,它对于切片来说效果非常好。为什么会这样呢?它到底是如何运作的?内存没有被释放是因为仍然有一个变量指向该内存吗?它与地图有何不同?
在某些情况下,我无法解释猩猩的行为。我尝试举一个简单的例子。这是我自己的文件“ main.go”:
package main
import (
"fmt"
)
func print1() {
fmt.Println("print 1")
}
func print2() {
fmt.Println("print 2")
}
func print3() {
fmt.Println("print 3")
}
func main() {
for i:=0; i<3; i++ {
go print1()
}
for i:=0; i<3; i++ {
go print2()
}
for i:=0; i<3; i++ {
go print3()
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这3个功能(每个循环中被调用3次)同时执行,结果打印数字的顺序是不可预测的。我不明白为什么该程序可以编译并执行而没有任何错误,但是它在控制台上什么都没打印!实际上,好像在for内部的函数调用未执行。如果删除这些go子句,则打印内容将显示在控制台上。我得出的结论是,并行线程无权在控制台上打印。如何查看具有实际“并发”行为的这些打印件?
拆分字符串时,使用strings.Split,如果输入字符串为空,则生成的空切片的长度为 1。
package main
import (
"strings"
"fmt"
)
func main() {
emptySlice1 := []string{}
debugSlice( emptySlice1 ) // prints "[], []string, len 0"
someStringToSplit := ""
emptySlice2 := strings.Split(someStringToSplit , " ")
debugSlice( emptySlice2 ) // prints "[], []string, len 1"
}
func debugSlice( s []string ){
fmt.Printf("%v, %T, len %v\n", s, s, len(s))
}
Run Code Online (Sandbox Code Playgroud)
游乐场可以在这里找到:https : //play.golang.org/p/kBYR048UtP_0
这是为什么?如何检查切片内的实际项目数(如果没有len功能)?