请教一个 Golang Go语言的语法问题
请教一个 Golang Go语言的语法问题
package main
import (
“io”
“net/http”
“net/rpc”
“net/rpc/jsonrpc”
)
type dd interface{}
func main() {
// rpc.RegisterName(“HelloService”, new(HelloService))
http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) {
var conn io.ReadWriteCloser = struct {
io.Writer
io.ReadCloser
}{
ReadCloser: r.Body, // 这里为什么不是 io.ReadCloser 这是一个 go 的语法特性,还是根据一个特性引申出的另一个特性? 叫什么? 谢谢
Writer: w,
// dd: 3,
}
rpc.ServeRequest(jsonrpc.NewServerCodec(conn))
})
http.ListenAndServe(":1234", nil)
}
问题在上端代码的注释中.提前表示感谢.
更多关于请教一个 Golang Go语言的语法问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
用匿名 struct 感觉为啥这么别扭
更多关于请教一个 Golang Go语言的语法问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我知道这是匿名, 匿名没问题,不过为什么"io/"不见连.
结构体嵌套了匿名结构 /接口的时候,引用起来就是类型名。
Embedding?
https://golang.org/doc/effective_go.html#embedding
"If we need to refer to an embedded field directly, the type name of the field, ignoring the package qualifier, serves as a field name"
这类问题,全都在语言规范里写了的
https://golang.org/ref/spec#Struct_types
A field declared with a type but no explicit field name is called an embedded field. An embedded field must be specified as a type name T or as a pointer to a non-interface type name *T, and T itself may not be a pointer type. The unqualified type name acts as the field name.
这里说了字段名是 unqualified type name,也就是不带 io.
定义 struct 只指定类型不指定字段名,默认就会用类型名称作为字段名,不包含包名
package main
import (
“fmt”
“io”
“reflect”
)
func main() {
type T struct {
Foo string
io.ReadCloser
}
s := reflect.ValueOf(&T{}).Elem()
for i := 0; i < s.NumField(); i++ {
fmt.Printf("%d: %s\n", i, s.Type().Field(i).Name)
}
// 0: Foo
// 1: ReadCloser
}
定义 struct 是定义类型,需要明确指定包名,实例化 struct 是指定字段名
谢谢 请问那本入门教程, 我看过 GO 语言圣经和 GO 高级编程 两本教材 书中的例子 没有类似的.
我说错了,这个例子就是 go 高级编程中的例子,但是 他没有说明为什么. Go 语言圣经里面没有类似例子.
当然可以,很高兴帮助你解答关于Golang(Go语言)的语法问题。请具体描述你遇到的语法困惑或者提供一个代码片段,这样我能给出更精确和有针对性的解答。不过,由于你没有提供具体的语法问题,我可以先概述一些常见的Go语言语法点,这些可能是初学者容易混淆的地方:
-
变量声明:Go使用
var
关键字声明变量,可以显式指定类型(如var x int
),也可以让编译器根据值自动推断类型(如var x = 10
或使用简短声明:=
)。 -
函数:函数定义使用
func
关键字,如func myFunction(a int, b int) int { return a + b }
。多返回值是Go的特色之一。 -
并发:Go原生支持并发,通过goroutines和channel实现。例如,
go myFunction()
启动一个新的goroutine执行myFunction
。 -
接口:接口是隐式实现的,即任何实现了接口中所有方法的类型都隐式地实现了该接口。
-
错误处理:Go鼓励显式处理错误,通常通过返回两个值(结果和错误)来实现。
-
切片与数组:切片是对数组的抽象,更加灵活且动态。
如果你有更具体的问题,比如关于上述某一点的详细用法或特例,请详细说明,我会提供更精确的解答。