我正在努力学习Go.当我以为我理解一个函数是什么,如何使用它并且想要进入接口时我就陷入了困境(来源 Go博客)
package main
import "fmt"
//define a Rectangle struct that has a length and a width
type Rectangle struct {
length, width int
}
//write a function Area that can apply to a Rectangle type
func (r Rectangle) Area() int {
return r.length * r.width
}
func main() {
r := Rectangle{length:5, width:3} //define a new Rectangle instance with values for its properties
fmt.Println("Rectangle details are: ",r)
fmt.Println("Rectangle's area is: ", r.Area())
}
Run Code Online (Sandbox Code Playgroud)
为什么我们有 func (r Rectangle) Area() …
我正在尝试解析一个字符串作为时间,但不幸的是得到错误的月份(1月而不是6月)
package main
import "fmt"
import "time"
func main() {
t := "2014-06-23T20:29:39.688+01:00"
tc, _ := time.Parse("2006-01-02T15:04:05.000+01:00", t)
fmt.Printf("t was %v and tc was %v", t, tc)
}
Run Code Online (Sandbox Code Playgroud)
除了自定义字段外,我还需要一个数据结构,它可以接受名称/值对。如何定义这样的结构?
例如
type mybasket struct {
Coupons string
Amount int
....... // string or int
}
Run Code Online (Sandbox Code Playgroud) 我有一个 go generate 指令,如下所示:
//go:generate myprog -someName thisname -data 'Request: Typ "." callMe, Rsp: MyTyp "." close'
Run Code Online (Sandbox Code Playgroud)
问题是程序只接收-someName标志值(“thisname”)。我认为由于-data某些原因该标志被丢弃。知道为什么吗?如果我直接从命令行执行程序,它就可以工作,所以我猜这是一个特定于 go 的问题。
我需要解压缩一个用 zlib 压缩的 git 对象。尽管该对象是用 zlib 压缩的,但它没有标头(我猜是为了节省带宽)。所以我试图在对象字节的顶部添加标头,但由于某些原因,zlib 仍然抱怨标头无效。我怀疑标题字节是作为字符串文字而不是字节添加的,但我不确定。请参阅下面的代码。
package main
import(
"compress/zlib"
"io/ioutil"
"bytes"
"fmt"
// "strings"
)
func main(){
b, err := ioutil.ReadFile("raw")
if err !=nil{
panic(err)
}
const header = "\x1f\x8b\x08\x00\x00\x00\x00\x00"
buf := bytes.NewBuffer(nil)
if _, err := buf.WriteString(header); err !=nil{
panic(err)
}
if _, err := buf.Write(b); err !=nil{
panic(err)
}
r, err := zlib.NewReader(buf)
if err !=nil{
panic(err)
}
defer r.Close()
var db []byte
if _, err := r.Read(db); err !=nil{
panic(err)
}
fmt.Printf("%s", db)
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 golang 和 google app engine 设置标头。下面是简单代码的样子:
w.Header().Set("Content-Type", "application/xml")
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("header-name", "value")
Run Code Online (Sandbox Code Playgroud)
它似乎无法在我的开发服务器上运行。我总是得到通常的标题和
content-type:text/plain; charset=utf-8
Run Code Online (Sandbox Code Playgroud)
当我部署时我得到
Content-Type:text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)
我做错了吗还是这是一个错误(另一个)?
我正在调查频道的行为,他们的行为让我很困惑。规范说,After calling close, and after any previously sent values have been received, receive operations will return the zero value for the channel's type without blocking.但是,即使到那个时候通道关闭了,我似乎仍然能在range语句中得到这些值。这是为什么?
package main
import "fmt"
import "sync"
import "time"
func main() {
iCh := make(chan int, 99)
var wg sync.WaitGroup
go func() {
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
iCh <- i
}(i)
}
wg.Wait()
close(iCh)
}()
time.Sleep(5 * time.Second)
print("the channel should be …Run Code Online (Sandbox Code Playgroud) 我需要使用反射包将指向映射的指针传递给另一个函数。想想 encoding/json.Unmarshal 只接受指针。下面是我需要使用反射做的一些代码:
myTyp := &MyType{}
json.Unmarshal(jsonPayload1, myTyp)
m := make(map[string]*MyType)
m["someKey"] = myTyp
// Dump it again to Unmarshal. It will overwrite it only if
// there is a `someKey` key.
x := json.Unmarshal(jsonPayload2, &m)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有以下几点:
....
m := reflect.MakeMap(reflect.MapOf(reflect.TypeOf(""), reflect.TypeOf(typ))
x := json.Unmarshal(jsonPayload2, m.Interface())
Run Code Online (Sandbox Code Playgroud)
此代码的问题在于它正在制作 map[string]MyType 的地图,但我无法为其创建指针。如果我尝试直接创建指针 [2],它会因reflect.MakeMap of non-map type.
为什么必须分配地图:
我需要分配的地图,以便我可以在特定键上设置 myTyp。myTyp 是使用多个解码源解码的,所以我不知道每个源解码了哪些字段,但我知道 Unmarshal 只覆盖与 json 内容/键匹配的键,因此可以安全地将相同的变量用于多个 Unmarshal 函数。
[2] reflect.MakeMap(reflect.PtrTo(reflect.MapOf(reflect.TypeOf("")), reflect.TypeOf(typ))
我发现了以下符号size *= b - a.我用反射检查了它,但似乎大小只是一个float64(a,b也是浮点数)所以我的问题是什么*?我希望它取消引用一个指针(大小)但它似乎不是案子.
我有一个非常复杂的json文档,但我只需要解码一个字符串locationx.我想知道是否有可能只解码一个特定的字段(按名称匹配),而不是为整个文档编写结构.我已经看到,即使结构与100%的文档结构不匹配,有时它也能解码json文档.
我想知道你怎么知道接口是否是类型指针.
package main
import "fmt"
import "reflect"
type str struct {
a, b string
}
func main() {
var s str
x := &s
t := reflect.TypeOf(interface{}(x))
fmt.Printf("%v", t.Size())
}
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以直接在源代码中使用gob编码数据(例如在函数中).原因是不必访问磁盘来获取gob文件来提高性能.我知道memcached,redis和朋友.我不需要TTL或任何其他奇特的功能.只是在内存中映射.数据将在"设置"/构建过程中编码并转储到源代码中,以便在运行时只需要"解码"它.
go应用程序基本上可以作为一个小的只读嵌入式数据库.我可以使用json(基本上用原始json声明一个var)来做到这一点,但我想会有性能损失所以我想知道它是否可能与gob.
我尝试了不同的东西,但我不能让它工作,因为基本上我不知道如何定义gob var(字节,[字节] ??)和解码器似乎期望一个io.Reader所以在开支之前整整一天,我决定至少问你这个问题.
悲惨的尝试:
var test string
test = "hello"
p := new(bytes.Buffer)
e := gob.NewEncoder(p)
e.Encode(test)
ers := ioutil.WriteFile("test.gob", p.Bytes(), 0600)
if ers != nil {
panic(ers)
}
Run Code Online (Sandbox Code Playgroud)
现在我想将test.gob添加到函数中.正如我所看到的,test.gob的源代码如下^H^L^@^Ehello
var test string
var b bytes.Buffer
b = byte("^H^L^@^Ehello")
de := gob.NewDecoder(b.Bytes())
er := de.Decode(&test)
if er != nil {
fmt.Printf("cannot decode")
panic(er)
}
fmt.Fprintf(w, test)
Run Code Online (Sandbox Code Playgroud) 我想在每个范围循环后增加一个变量.然而,似乎不可能使用标准( for init; condition; post { })语法,因此我想知道为什么.这就是我想要做的
for item := range itemsList; page++ {
}
Run Code Online (Sandbox Code Playgroud)
似乎唯一的办法就是这样做
for item := range itemsList{
page++
}
Run Code Online (Sandbox Code Playgroud)
这看起来不像第一个那么好.
go ×13
concurrency ×1
gob ×1
performance ×1
pointers ×1
reflection ×1
time ×1
types ×1
zlib ×1