请教一个 Golang Go语言的语法问题

发布于 1周前 作者 yuanlaile 来自 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

10 回复

用匿名 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语言语法点,这些可能是初学者容易混淆的地方:

  1. 变量声明:Go使用var关键字声明变量,可以显式指定类型(如var x int),也可以让编译器根据值自动推断类型(如var x = 10或使用简短声明:=)。

  2. 函数:函数定义使用func关键字,如func myFunction(a int, b int) int { return a + b }。多返回值是Go的特色之一。

  3. 并发:Go原生支持并发,通过goroutines和channel实现。例如,go myFunction()启动一个新的goroutine执行myFunction

  4. 接口:接口是隐式实现的,即任何实现了接口中所有方法的类型都隐式地实现了该接口。

  5. 错误处理:Go鼓励显式处理错误,通常通过返回两个值(结果和错误)来实现。

  6. 切片与数组:切片是对数组的抽象,更加灵活且动态。

如果你有更具体的问题,比如关于上述某一点的详细用法或特例,请详细说明,我会提供更精确的解答。

回到顶部