小编zha*_*zhi的帖子

是否可以在golang中调用父结构的重写方法?

我想实现这样的代码,其中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)

oop inheritance overriding go

49
推荐指数
4
解决办法
4万
查看次数

声明(ticks)和php中的信号处理程序之间的关系是什么

我有一些像这样的代码,我想了解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)

php pcntl

8
推荐指数
1
解决办法
1729
查看次数

为什么[]字符串无法在golang中转换为[] interface {}

我发现它很奇怪,为什么[]字符串无法转换为[] interface {}?

我认为这应该是可能的,因为:

  1. 他们都是切片
  2. []字符串的每个元素都是字符串,当然是接口{}

但在下面的示例中,它将是编译错误

func f(args ...interface{}){

}
s := []string{"ssd", "rtt"}
f(s...)
Run Code Online (Sandbox Code Playgroud)

为什么语言无法自动完成转换?

types interface go

6
推荐指数
2
解决办法
1163
查看次数

有人可以告诉我golang中io.ReadFull和bytes.Buffer.ReadFrom的行为是什么

我在执行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)

io buffer byte tcp go

4
推荐指数
1
解决办法
3869
查看次数

标签 统计

go ×3

buffer ×1

byte ×1

inheritance ×1

interface ×1

io ×1

oop ×1

overriding ×1

pcntl ×1

php ×1

tcp ×1

types ×1