我想实现这样的代码,其中B继承自A并且只覆盖A的Foo()方法,我希望代码打印B.Foo(),但它仍然打印A.Foo(),似乎接收器在Golang在C++中无法像这样工作,在启用动态绑定的情况下,代码可以像我想要的那样工作.
我还发布了另一段代码,但它实现起来太难了,而且更像是一种黑客方式,我认为它不是Golang风格.
所以我的问题是:如果父的Bar()方法有一些逻辑,例如,打开一个文件,然后读取一些行,并使用Foo()将这些行输出到stdout,并将Child(在示例中为B)想要使用它们中的大多数,唯一的区别是Child希望Foo()将行输出到另一个文件.我该如何实施呢?我听说Golang的继承不能像C++或Java那样工作,Golang中的正确方法是什么?
package main
import (
"fmt"
)
type A struct {
}
func (a *A) Foo() {
fmt.Println("A.Foo()")
}
func (a *A) Bar() {
a.Foo()
}
type B struct {
A
}
func (b *B) Foo() {
fmt.Println("B.Foo()")
}
func main() {
b := B{A: A{}}
b.Bar()
}
output: A.Foo()
Run Code Online (Sandbox Code Playgroud)
以下作品有效,但写作时
a := A{}
a.Bar()
Run Code Online (Sandbox Code Playgroud)
您将遇到编译器错误
package main
import (
"fmt"
)
type I interface {
Foo()
}
type A struct {
i I
}
func (a *A) …Run Code Online (Sandbox Code Playgroud) 我有一些像这样的代码,我想了解fork如何工作,但我很困惑 declare(ticks=1).当我把它放在第一行时,在子进程完成后,将调用信号处理程序,这就是我想要的; 但当我删除它时,永远不会调用信号处理程序!所以,我想知道滴答声如何影响信号处理.
<?php
declare(ticks=1);
function sigHandler($signal)
{
echo "a child exited\n";
}
pcntl_signal(SIGCHLD, sigHandler, false);
echo "this is " . posix_getpid() . PHP_EOL;
for($i=0; $i<3; $i++)
{
$pid = pcntl_fork();
if($pid == -1)
{
echo 'fork failed ' . PHP_EOL;
}
else if($pid)
{
}
else
{
$pid = posix_getpid();
echo 'child ' . $pid . ' ' . time() . PHP_EOL;
sleep(rand(2,5));
echo 'child ' . $pid . ' done ' . time() . PHP_EOL;
exit(0);
} …Run Code Online (Sandbox Code Playgroud) 我发现它很奇怪,为什么[]字符串无法转换为[] interface {}?
我认为这应该是可能的,因为:
但在下面的示例中,它将是编译错误
func f(args ...interface{}){
}
s := []string{"ssd", "rtt"}
f(s...)
Run Code Online (Sandbox Code Playgroud)
为什么语言无法自动完成转换?
我在执行tcp c / s演示时遇到问题,发现在服务器端使用io.ReadFull(conn,aByteArr)或bytes.Buffer.ReadFrom(conn)时,这很奇怪,服务器似乎不会直到客户端退出,换句话说,服务器卡住,才读取连接中的数据,但是我可以使用基本的conn.Read(aBuffer)读取数据。为什么这两种方法如此奇怪?
因为我希望服务器处理任意大小的数据,所以我不喜欢使用基本方式,我的意思是conn.Read(),它必须首先创建具有指定大小的字节片。请帮我。
我可以提供我的代码:客户:
package main
import (
"net"
"fmt"
"bufio"
"time"
"runtime"
)
func send(s string, ch chan string){
conn, err := net.Dial("tcp", ":4000")
if err != nil {
fmt.Println(err)
}
fmt.Fprintf(conn, s)
fmt.Println("send: ", s)
/*
s := "server run"
conn.Write([]byte(s))
*/
status, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Println("error: ", err)
}
ch <- status
}
func main(){
runtime.GOMAXPROCS(runtime.NumCPU())
fmt.Println("cpu: ", runtime.NumCPU())
ch := make(chan string, 5)
timeout := time.After(10 * time.Second)
i …Run Code Online (Sandbox Code Playgroud)