Hi, I´m looking foward to find a Tool able to convert any Java Source code 
Project to a GoLang Project. I know that are Programming languages created 
for different propposal. Java is OOL and  goLang is different. So 
convertion is possible, but I think is very complex.  For me is much more 
easy look on Java Source code logic and write your own code in GoLang.  I 
think....

I did it in the past, and writting code in a new language make de new code 
more maintenable.

Em domingo, 22 de maio de 2022 às 03:49:42 UTC-3, alex-coder escreveu:

> So, channels.
> Converter can now convert Java classes to Go channels where possible. The 
> previous example contains a Drop class that matches the conversion 
> criteria, as shown in the Go example code below. Accordingly, if the 
> converter "does not find" a class suitable for conversion, Java 
> multithreading will be converted to Go code without using the translation 
> into channels.
> *Java code:*
> package com.builder.start.here;
>
> import java.util.Random;
>
> public class RunMe {
>     public static void main(String[] args) {
>         Drop drop = new Drop();
>         (new Thread(new Producer(drop))).start();
>         (new Thread(new Consumer(drop))).start();
>     }
> }
> class Drop {
>     // Message sent from producer
>     // to consumer.
>     private String message;
>     // True if consumer should wait
>     // for producer to send message,
>     // false if producer should wait for
>     // consumer to retrieve message.
>     private boolean empty = true;
>
>     public synchronized String take() {
>         // Wait until message is
>         // available.
>         while (empty) {
>             try {
>                 wait();
>             } catch (InterruptedException e) {}
>         }
>         // Toggle status.
>         empty = true;
>         // Notify producer that
>         // status has changed.
>         notifyAll();
>         return message;
>     }
>
>     public synchronized void put(String message) {
>         // Wait until message has
>         // been retrieved.
>         while (!empty) {
>             try { 
>                 wait();
>             } catch (InterruptedException e) {}
>         }
>         // Toggle status.
>         empty = false;
>         // Store message.
>         this.message = message;
>         // Notify consumer that status
>         // has changed.
>         notifyAll();
>     }
> }
> class Consumer implements Runnable {
>     private Drop drop;
>
>     public Consumer(Drop drop) {
>         this.drop = drop;
>     }
>
>     public void run() {
>         Random random = new Random();
>         for (
>            String message = drop.take(); 
>            ! message.equals("DONE"); 
>            message = drop.take()) {
>             System.out.format(
>                "MESSAGE RECEIVED: %s%n", message);
>              try {
>                 Thread.sleep(random.nextInt(5000));
>            } catch (InterruptedException e) {}
>         }
>     }
> }
> class Producer implements Runnable {
>     private Drop drop;
>
>     public Producer(Drop drop) {
>         this.drop = drop;
>     }
>
>     public void run() {
>         String importantInfo[] = {
>             "Mares eat oats",
>             "Does eat oats",
>             "Little lambs eat ivy",
>             "A kid will eat ivy too"
>         };
>         Random random = new Random();
>
>         for (int i = 0; i < importantInfo.length; i++) {
>             drop.put(importantInfo[i]);
>             try {
>                 Thread.sleep(random.nextInt(5000));
>             } catch (InterruptedException e) {}
>         }
>         drop.put("DONE");
>     }
> }
>
> *Converter gave out:*
>
> package main
>
> import (
>     "fmt"
>     "math/rand"
>     "os"
>     "sync"
>     "time"
> )
>
> type RunMe struct{}
>
> func NewRunMe() *RunMe {
>     var runMe RunMe = RunMe{}
>     return &runMe
> }
> func main() {
>     var args []string = os.Args
>     var rm *RunMe = NewRunMe()
>     rm.RunMe_main(&args)
> }
> /** generated method **/
> func (runMe *RunMe) RunMe_main(args *[]string) {
>     wg := &sync.WaitGroup{}
>     var drop chan string = make(chan string)
>
>     wg.Add(1)
>     go (&Thread{NewProducer(drop)}).run(wg)
>     wg.Add(1)
>     go (&Thread{NewConsumer(drop)}).run(wg)
>     wg.Wait()
> }
> type Consumer struct {
>     drop chan string
> }
> func NewConsumer(drop chan string) *Consumer {
>
>     var consumer Consumer = Consumer{drop}
>     return &consumer
> }
> func (consumer *Consumer) run(wg *sync.WaitGroup) {
>     defer wg.Done()
>     var random *Random = NewRandom()
>     for message := <-consumer.drop; 
>                      message != "DONE"; 
>                      message = <-consumer.drop {
>
>         fmt.Printf("MESSAGE RECEIVED: %s\n", message)
>         time.Sleep(random.nextInt(5000))
>     }
> }
> type Producer struct {
>     drop chan string
> }
> func NewProducer(drop chan string) *Producer {
>
>     var producer Producer = Producer{drop}
>     return &producer
> }
> func (producer *Producer) run(wg *sync.WaitGroup) {
>     defer wg.Done()
>     var importantInfo [4]string = [4]string{
>                         "Mares eat oats", 
>                          "Does eat oats", 
>                          "Little lambs eat ivy", 
>                           "A kid will eat ivy too"}
>     var random *Random = NewRandom()
>     for i := 0; i < len(importantInfo); i++ {
>         producer.drop <- (importantInfo[i])
>         time.Sleep(random.nextInt(5000))
>     }
>     producer.drop <- ("DONE")
>
> }
>
> type Random struct{}
> func NewRandom() *Random {
>     var random Random = Random{}
>     return &random
> }
> func (r *Random) nextInt(n int) time.Duration { return 
> time.Duration(rand.Intn(n)) }
> type Thread struct {
>     Runnable
> }
> func (t *Thread) run(wg *sync.WaitGroup) {
>     t.Runnable.run(wg)
> }
> type Runnable interface {
>     run(wg *sync.WaitGroup)
> }
>
> You can run code there:
> Go Playground <https://go.dev/play/p/-y6f_rOa4EX>
>
> Now I'll take a break, I need to deal with the advices that I received.
>
> Thank you to all very much.
> среда, 18 мая 2022 г. в 13:43:07 UTC+3, alex-coder: 
>
>> Henry,
>> thank you, it is quite possible that you are right, at least I should 
>> check it out.
>> Thank you again.
>>
>> среда, 18 мая 2022 г. в 07:39:49 UTC+3, Henry: 
>>
>>> Kudos to you. Java to Go is a lot of work. Java is a more complex 
>>> language. It has more features and more possibilities for expressing the 
>>> same model/algorithm. You need to identify all these possibilities, parse, 
>>> and convert them to Go. I could be wrong about this, but it may be easier 
>>> to convert Java bytecode to Go.   
>>>
>>> On Tuesday, May 17, 2022 at 9:49:09 PM UTC+7 alex-coder wrote:
>>>
>>>> In Go, multithreading is one of the main features, respectively, the 
>>>> ability to convert Java code using multithreading into Go code 
>>>> automatically, which uses channels, is very important.
>>>> I found a suitable example of ProducerConsumerExample from Oracle 
>>>> there:Oracle 
>>>> sample 
>>>> <https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html>,
>>>>  
>>>> where the Drop class is a candidate for conversion to Go using channels.
>>>> But, now I give an intermediate result without channels.
>>>> Also, I read the opinion that the conversion of Java code where 
>>>> annotations are used in runtime is impossible. It is necessary to 
>>>> investigate the problem and try to understand if it is possible to solve 
>>>> it 
>>>> somehow. Before transferring a project from the status of "possibility of 
>>>> achievement" to the status of "prototype", it is necessary to see what can 
>>>> be done with these problems in relation to annotations.
>>>> *Java code:*
>>>> package com.builder.start.here;
>>>>
>>>> import java.util.Random;
>>>>
>>>> public class RunMeDrop {
>>>>
>>>>     public static void main(String[] args) {
>>>>         Drop drop = new Drop();
>>>>         (new Thread(new Producer(drop))).start();
>>>>         (new Thread(new Consumer(drop))).start();
>>>>     }
>>>> }
>>>> class Drop {
>>>>     // Message sent from producer
>>>>     // to consumer.
>>>>     private String message;
>>>>     // True if consumer should wait
>>>>     // for producer to send message,
>>>>     // false if producer should wait for
>>>>     // consumer to retrieve message.
>>>>     private boolean empty = true;
>>>>
>>>>     public synchronized String take() {
>>>>         // Wait until message is
>>>>         // available.
>>>>         while (empty) {
>>>>             try {
>>>>                 wait();
>>>>             } catch (InterruptedException e) {}
>>>>         }
>>>>         // Toggle status.
>>>>         empty = true;
>>>>         // Notify producer that
>>>>         // status has changed.
>>>>         notifyAll();
>>>>         return message;
>>>>     }
>>>>
>>>>     public synchronized void put(String message) {
>>>>         // Wait until message has
>>>>         // been retrieved.
>>>>         while (!empty) {
>>>>             try { 
>>>>                 wait();
>>>>             } catch (InterruptedException e) {}
>>>>         }
>>>>         // Toggle status.
>>>>         empty = false;
>>>>         // Store message.
>>>>         this.message = message;
>>>>         // Notify consumer that status
>>>>         // has changed.
>>>>         notifyAll();
>>>>     }
>>>> }
>>>> class Consumer implements Runnable {
>>>>     private Drop drop;
>>>>
>>>>     public Consumer(Drop drop) {
>>>>         this.drop = drop;
>>>>     }
>>>>
>>>>     public void run() {
>>>>         Random random = new Random();
>>>>         for (
>>>>            String message = drop.take(); 
>>>>            ! message.equals("DONE"); 
>>>>            message = drop.take()) {
>>>>             System.out.format(
>>>>                "MESSAGE RECEIVED: %s%n", message);
>>>>              try {
>>>>                 Thread.sleep(random.nextInt(5000));
>>>>            } catch (InterruptedException e) {}
>>>>         }
>>>>     }
>>>> }
>>>> class Producer implements Runnable {
>>>>     private Drop drop;
>>>>
>>>>     public Producer(Drop drop) {
>>>>         this.drop = drop;
>>>>     }
>>>>
>>>>     public void run() {
>>>>         String importantInfo[] = {
>>>>             "Mares eat oats",
>>>>             "Does eat oats",
>>>>             "Little lambs eat ivy",
>>>>             "A kid will eat ivy too"
>>>>         };
>>>>         Random random = new Random();
>>>>
>>>>         for (int i = 0; i < importantInfo.length; i++) {
>>>>             drop.put(importantInfo[i]);
>>>>             try {
>>>>                 Thread.sleep(random.nextInt(5000));
>>>>             } catch (InterruptedException e) {}
>>>>         }
>>>>         drop.put("DONE");
>>>>
>>>>     }
>>>> }
>>>>
>>>> *Converter gave out:*
>>>> package main
>>>>
>>>> import (
>>>>     "fmt"
>>>>     "math/rand"
>>>>     "os"
>>>>     "sync"
>>>>     "time"
>>>> )
>>>>
>>>> type RunMe struct{}
>>>>
>>>> func NewRunMe() *RunMe {
>>>>     var runMe RunMe = RunMe{}
>>>>     return &runMe
>>>>
>>>> }
>>>> func main() {
>>>>
>>>>     var args []string = os.Args
>>>>     var rm *RunMe = NewRunMe()
>>>>     rm.RunMe_main(&args)
>>>> }
>>>>
>>>> /** generated method **/
>>>> func (runMe *RunMe) RunMe_main(args *[]string) {
>>>>     wg := &sync.WaitGroup{}
>>>>     var drop *Drop = NewDrop()
>>>>     wg.Add(1)
>>>>     go (&Thread{NewProducer(drop)}).run(wg)
>>>>     wg.Add(1)
>>>>     go (&Thread{NewConsumer(drop)}).run(wg)
>>>>     wg.Wait()
>>>> }
>>>>
>>>> type Drop struct {
>>>>     /** generated field */
>>>>     cond *sync.Cond
>>>>     message *string
>>>>     empty *bool
>>>> }
>>>>
>>>> func NewDrop() *Drop {
>>>>
>>>>     var drop Drop = Drop{}
>>>>     drop.cond = sync.NewCond(&sync.Mutex{})
>>>>     empty := true
>>>>     drop.empty = &empty
>>>>     return &drop
>>>> }
>>>> func (drop *Drop) take() string {
>>>>     drop.cond.L.Lock()
>>>>     for *drop.empty {
>>>>         drop.cond.Wait()
>>>>     }
>>>>
>>>>     *drop.empty = true
>>>>     drop.cond.L.Unlock()
>>>>     drop.cond.Broadcast()
>>>>     return *drop.message
>>>> }
>>>> func (drop *Drop) put(message *string) {
>>>>     drop.cond.L.Lock()
>>>>     for !*drop.empty {
>>>>         drop.cond.Wait()
>>>>     }
>>>>
>>>>     *drop.empty = false
>>>>     drop.message = message
>>>>     drop.cond.L.Unlock()
>>>>     drop.cond.Broadcast()
>>>> }
>>>>
>>>> type Consumer struct {
>>>>     drop *Drop
>>>> }
>>>>
>>>> func NewConsumer(drop *Drop) *Consumer {
>>>>     var consumer Consumer = Consumer{drop}
>>>>     return &consumer
>>>> }
>>>> func (consumer *Consumer) run(wg *sync.WaitGroup) {
>>>>     defer wg.Done()
>>>>
>>>>     var random *Random = NewRandom()
>>>>     for message := consumer.drop.take(); 
>>>>          message != "DONE"; 
>>>>          message = consumer.drop.take() {
>>>>         fmt.Printf("MESSAGE RECEIVED: %s\n", message)
>>>>         time.Sleep(random.nextInt(5000))
>>>>         }
>>>> }
>>>>
>>>> type Producer struct {
>>>>     drop *Drop
>>>> }
>>>>
>>>> func NewProducer(drop *Drop) *Producer {
>>>>     var producer Producer = Producer{drop}
>>>>     return &producer
>>>> }
>>>> func (producer *Producer) run(wg *sync.WaitGroup) {
>>>>     defer wg.Done()
>>>>
>>>>     var importantInfo [4]string = [4]string{
>>>>         "Mares eat oats",
>>>>         "Does eat oats",
>>>>         "Little lambs eat ivy",
>>>>         "A kid will eat ivy too",
>>>>     }
>>>>
>>>>     var random *Random = NewRandom()
>>>>     for i := 0; i < len(importantInfo); i++ {
>>>>         producer.drop.put(&importantInfo[i])
>>>>         time.Sleep(random.nextInt(5000))
>>>>     }
>>>>     s := "DONE"
>>>>     producer.drop.put(&s)
>>>> }
>>>>
>>>> type Random struct{}
>>>>
>>>> func NewRandom() *Random {
>>>>     var random Random = Random{}
>>>>     return &random
>>>> }
>>>>
>>>> func (r *Random) nextInt(n int) time.Duration { 
>>>>     return time.Duration(rand.Intn(n)) 
>>>> }
>>>>
>>>> type Thread struct {
>>>>     Runnable
>>>> }
>>>>
>>>> func (t *Thread) run(wg *sync.WaitGroup) {
>>>>     t.Runnable.run(wg)
>>>> }
>>>>
>>>> type Runnable interface {
>>>>     run(wg *sync.WaitGroup)
>>>> }
>>>> The Go Playground, you can run code there:
>>>> Go Playground. <https://go.dev/play/p/o7tXt8p2m_3>
>>>>
>>>> Thank you to all very much.
>>>>
>>>> четверг, 28 апреля 2022 г. в 19:08:51 UTC+3, alex-coder: 
>>>>
>>>>> So, multithreading.
>>>>> I found a simple example from Oracle with the wonderful name "Bad 
>>>>> Threads" there:
>>>>>
>>>>> https://docs.oracle.com/javase/tutorial/essential/concurrency/QandE/questions.html
>>>>>  
>>>>> , simplified it even more, called the example a new simple name One and 
>>>>> extend a Converter to translate the code to Golang.
>>>>> There is no similar processing for InterruptedException in go, so the 
>>>>> Converter does not translate the processing of this interrupt in any way. 
>>>>> If anyone has a relatively small example in Java, please share it.
>>>>> *Java code:*
>>>>> package run.me;
>>>>> public class One {
>>>>>   String msg;
>>>>>   public static void main(  String[] args) throws InterruptedException 
>>>>> {
>>>>>     One one=new One();
>>>>>     one.msg="Initial message";
>>>>>     System.out.println("main:before start:" + one.msg + " second part 
>>>>> of");
>>>>>     new Second(one).start();
>>>>>     one.msg="after go start";
>>>>>     Thread.sleep(2000);
>>>>>     System.out.println("main:about to end:" + one.msg);
>>>>>   }
>>>>> }
>>>>> class Second extends Thread {
>>>>>   One one;
>>>>>   public Second(  One one){
>>>>>     this.one=one;
>>>>>   }
>>>>>   public void run(){
>>>>>     try {
>>>>>       sleep(1000);
>>>>>     } catch (    InterruptedException e) {
>>>>>     }
>>>>>     System.out.println("run:after sleep:" + one.msg);
>>>>>     one.msg="try to change msg";
>>>>>   }
>>>>> }
>>>>> *Converter выдал:*
>>>>> package main
>>>>>
>>>>> import (
>>>>>     "fmt"
>>>>>     "os"
>>>>>     "time"
>>>>> )
>>>>>
>>>>> type One struct {
>>>>>     msg *string
>>>>> }
>>>>>
>>>>> func NewOne() *One {
>>>>>     var one One = One{}
>>>>>     return &one
>>>>> }
>>>>> func main() {
>>>>>     var args []string = os.Args
>>>>>     var o_dummy *One = NewOne()
>>>>>     o_dummy.One_main(&args)
>>>>> }
>>>>>
>>>>> /** generated method **/
>>>>> func (one_one *One) One_main(args *[]string) {
>>>>>     var one *One = NewOne()
>>>>>     s := "Initial message"
>>>>>     one.msg = &s
>>>>>     fmt.Println("main:before start:" + *one.msg + " second part of")
>>>>>     go NewSecond(one).run()
>>>>>     s_s := "after go start"
>>>>>     one.msg = &s_s
>>>>>     time.Sleep(2000)
>>>>>     fmt.Println("main:about to end:" + *one.msg)
>>>>> }
>>>>>
>>>>> type Second struct {
>>>>>     one *One
>>>>> }
>>>>>
>>>>> func NewSecond(one *One) *Second {
>>>>>     var second Second = Second{one}
>>>>>     return &second
>>>>> }
>>>>> func (second *Second) run() {
>>>>>     time.Sleep(1000)
>>>>>     fmt.Println("run:after sleep:" + *second.one.msg)
>>>>>     s_s_s := "try to change msg"
>>>>>     second.one.msg = &s_s_s
>>>>> }
>>>>>
>>>>> The next example will probably be about channel's.
>>>>> If anyone has an interesting example, write me, I'll think about how 
>>>>> to solve it. I just can't promise that it will be quickly. :-)
>>>>>
>>>>> Thank you to all !
>>>>>
>>>>> четверг, 7 апреля 2022 г. в 18:52:25 UTC+3, alex-coder: 
>>>>>
>>>>>> Thanks for the comments about generating code to handle exceptions. . 
>>>>>> Here it is a new version.
>>>>>> package main
>>>>>>
>>>>>> import (
>>>>>>     "fmt"
>>>>>>     "os"
>>>>>> )
>>>>>>
>>>>>> type CatchException struct{}
>>>>>>
>>>>>> func main() {
>>>>>>
>>>>>>     var args []string = os.Args
>>>>>>
>>>>>>     var ce CatchException = CatchException{}
>>>>>>     ce.CatchException_main(args)
>>>>>> }
>>>>>>
>>>>>> /** generated method **/
>>>>>> func (catchException *CatchException) CatchException_main(args 
>>>>>> []string) {
>>>>>>     defer func() {
>>>>>>         if err := recover(); err != nil {
>>>>>>             exc := err.(Exception)
>>>>>>             switch exc.msg {
>>>>>>
>>>>>>             case "Exception":
>>>>>>                 fmt.Println("yes, I caught it")
>>>>>>             default:
>>>>>>                 fmt.Println("No, something is not right")
>>>>>>             }
>>>>>>         }
>>>>>>         fmt.Println("finally processing")
>>>>>>     }()
>>>>>>
>>>>>>     (&ThrowException{}).runme()
>>>>>> }
>>>>>>
>>>>>> type ThrowException struct{}
>>>>>>
>>>>>> func (throwException *ThrowException) runme() {
>>>>>>     panic(Exception{"Exception"})
>>>>>> }
>>>>>>
>>>>>> type Exception struct {
>>>>>>     msg string
>>>>>> }
>>>>>>
>>>>>> понедельник, 4 апреля 2022 г. в 14:12:37 UTC+3, alex-coder: 
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> *Another use case for automatically translating codewritten in Java 
>>>>>>> to Golang is Exception Handling.The next example is likely to be about 
>>>>>>> multithreading.Example in Java:*
>>>>>>> package com.builder.start.here;
>>>>>>>
>>>>>>> public class CatchException {
>>>>>>>
>>>>>>>     public static void main(String[] args) {
>>>>>>>         try {
>>>>>>>             new ThrowException().runme();
>>>>>>>         } catch (Exception e) {
>>>>>>>             System.out.println("yes, I caught it");
>>>>>>>         } finally {
>>>>>>>             System.out.println("finally processing");
>>>>>>>         }
>>>>>>>
>>>>>>>     }
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> class ThrowException{
>>>>>>>     public void runme() throws Exception{
>>>>>>>         throw new Exception();
>>>>>>>     }
>>>>>>> }
>>>>>>>
>>>>>>> *Converter gave out:*
>>>>>>>
>>>>>>> package main
>>>>>>>
>>>>>>> import (
>>>>>>>     "fmt"
>>>>>>>     "os"
>>>>>>> )
>>>>>>>
>>>>>>> type CatchException struct{}
>>>>>>>
>>>>>>>
>>>>>>> func main() {
>>>>>>>
>>>>>>>     var args []string = os.Args
>>>>>>>
>>>>>>>     var ce CatchException = CatchException{}
>>>>>>>     ce.CatchException_main(args)
>>>>>>> }
>>>>>>>
>>>>>>> /** generated method **/
>>>>>>> func (catchException *CatchException) CatchException_main(args 
>>>>>>> []string) {
>>>>>>>     defer func() {
>>>>>>>         if err := recover(); err != nil {
>>>>>>>             str := err.(string)
>>>>>>>             switch str {
>>>>>>>             case "Exception":
>>>>>>>                 fmt.Println("yes, I caught it")
>>>>>>>             default:
>>>>>>>                 fmt.Println("No, something is not right")
>>>>>>>             }
>>>>>>>         }
>>>>>>>         fmt.Println("finally processing")
>>>>>>>     }()
>>>>>>>
>>>>>>>     (&ThrowException{}).runme()
>>>>>>> }
>>>>>>>
>>>>>>> type ThrowException struct{}
>>>>>>>
>>>>>>> func (throwException *ThrowException) runme() {
>>>>>>>     panic("Exception")
>>>>>>> }
>>>>>>> воскресенье, 27 марта 2022 г. в 15:11:48 UTC+3, alex-coder: 
>>>>>>>
>>>>>>>> After several months of switching from Java to Golang, it seemed to 
>>>>>>>> me that
>>>>>>>> it would be interesting to make the translation of Java code into 
>>>>>>>> Golang automatically.
>>>>>>>> The text below shows what has been done so far.
>>>>>>>>
>>>>>>>> The work is not a prototype, but rather indicates the possibility 
>>>>>>>> of achieving a result.
>>>>>>>> Therefore, I deliberately simplify the development context of the 
>>>>>>>> Converter where it was 
>>>>>>>> possible. 
>>>>>>>>
>>>>>>>> At first it seemed important to me that between Java and Go there 
>>>>>>>> is a difference 
>>>>>>>> between the implementation of the Dynamic Dispatching, more 
>>>>>>>> precisely, there is no 
>>>>>>>> Dynamic Dispatching in Go. The applied solution in the current 
>>>>>>>> implementation 
>>>>>>>> looks not only ugly but even violates the several very important 
>>>>>>>> rules of the OO design, 
>>>>>>>> I'm not kidding here. But this option looks like that it will be 
>>>>>>>> working. 
>>>>>>>>
>>>>>>>> Onward I will provide the 4 code samples in Java, followed by the 
>>>>>>>> automatically 
>>>>>>>> generated Golang code and comments as needed. 
>>>>>>>>
>>>>>>>> *1. Of course, I started with the most popular program: "Hello 
>>>>>>>> World".*
>>>>>>>>
>>>>>>>> package main;
>>>>>>>>
>>>>>>>> public class HelloWorld {
>>>>>>>>   public static void main(  String[] args){
>>>>>>>>     System.out.println("Hello World");
>>>>>>>>   }
>>>>>>>> }
>>>>>>>>
>>>>>>>> *Converter gave out:*
>>>>>>>>
>>>>>>>> package main
>>>>>>>>
>>>>>>>> import (
>>>>>>>>         "fmt"
>>>>>>>>         "os"
>>>>>>>> )
>>>>>>>>
>>>>>>>> type HelloWorld struct{}
>>>>>>>>
>>>>>>>> func main() {
>>>>>>>>
>>>>>>>>         var args []string = os.Args
>>>>>>>>
>>>>>>>>         var hw HelloWorld = HelloWorld{}
>>>>>>>>         hw.HelloWorld_main(args)
>>>>>>>> }
>>>>>>>>
>>>>>>>> /** generated method **/
>>>>>>>> func (helloWorld *HelloWorld) HelloWorld_main(args []string) {
>>>>>>>>         fmt.Println("Hello World")
>>>>>>>> }
>>>>>>>>
>>>>>>>> *2. Next, it was interesting to deal with the problem of a simple 
>>>>>>>> inheritance.*
>>>>>>>>
>>>>>>>> package main;
>>>>>>>>
>>>>>>>> public class TestInheritance {
>>>>>>>>   public static void main(  String[] args){
>>>>>>>>     Inheritance inh=null;
>>>>>>>>     inh=new Second();
>>>>>>>>     inh.hello();
>>>>>>>>     inh=new Third();
>>>>>>>>     inh.hello();
>>>>>>>>   }
>>>>>>>> }
>>>>>>>> public interface Inheritance {
>>>>>>>>   public void hello();
>>>>>>>> }
>>>>>>>> class Second implements Inheritance {
>>>>>>>>   public void hello(){
>>>>>>>>     System.out.println("Second");
>>>>>>>>   }
>>>>>>>> }
>>>>>>>> class Third implements Inheritance {
>>>>>>>>   public void hello(){
>>>>>>>>     System.out.println("Third");
>>>>>>>>   }
>>>>>>>> }
>>>>>>>>  
>>>>>>>> *Converter gave out:*
>>>>>>>>
>>>>>>>> package main
>>>>>>>>
>>>>>>>> import (
>>>>>>>>         "fmt"
>>>>>>>>         "os"
>>>>>>>> )
>>>>>>>>
>>>>>>>> type TestInheritance struct{}
>>>>>>>>
>>>>>>>> func main() {
>>>>>>>>
>>>>>>>>         var args []string = os.Args
>>>>>>>>
>>>>>>>>         var ti TestInheritance = TestInheritance{}
>>>>>>>>         ti.TestInheritance_main(args)
>>>>>>>> }
>>>>>>>>
>>>>>>>> /** generated method **/
>>>>>>>> func (testInheritance *TestInheritance) TestInheritance_main(args 
>>>>>>>> []string) {
>>>>>>>>
>>>>>>>>         var inh Inheritance
>>>>>>>>         inh = AddressSecond(Second{})
>>>>>>>>         inh.hello()
>>>>>>>>         inh = AddressThird(Third{})
>>>>>>>>         inh.hello()
>>>>>>>> }
>>>>>>>>
>>>>>>>> type Inheritance interface {
>>>>>>>>         hello()
>>>>>>>> }
>>>>>>>> type Second struct{}
>>>>>>>>
>>>>>>>> func (second *Second) hello() {
>>>>>>>>         fmt.Println("Second")
>>>>>>>> }
>>>>>>>>
>>>>>>>> type Third struct{}
>>>>>>>>
>>>>>>>> func (third *Third) hello() {
>>>>>>>>         fmt.Println("Third")
>>>>>>>> }
>>>>>>>>
>>>>>>>> func AddressSecond(s Second) *Second { return &s }
>>>>>>>> func AddressThird(t Third) *Third    { return &t }
>>>>>>>>
>>>>>>>>
>>>>>>>> *3. In the following example, it is necessary to correctly define   
>>>>>>>>  a common interface for the inheritance tree.*
>>>>>>>>
>>>>>>>> package no.packeges;
>>>>>>>>
>>>>>>>> public class TestExtension {
>>>>>>>>   public static void main(  String[] args){
>>>>>>>>     TestExtension te=new TestExtension();
>>>>>>>>     te.hello();
>>>>>>>>     te=new Second();
>>>>>>>>     te.hello();
>>>>>>>>     te=new Third();
>>>>>>>>     te.hello();
>>>>>>>>     te=new Fourth();
>>>>>>>>     te.hello();
>>>>>>>>   }
>>>>>>>>   public void hello(){
>>>>>>>>     System.out.println("hello");
>>>>>>>>   }
>>>>>>>> }
>>>>>>>> class Second extends TestExtension {
>>>>>>>>   public void hello(){
>>>>>>>>     System.out.println("Second");
>>>>>>>>   }
>>>>>>>> }
>>>>>>>> class Third extends TestExtension {
>>>>>>>>   public void hello(){
>>>>>>>>     System.out.println("Third");
>>>>>>>>   }
>>>>>>>> }
>>>>>>>> class Fourth extends Third {
>>>>>>>>   public void hello(){
>>>>>>>>     System.out.println("Fourth");
>>>>>>>>   }
>>>>>>>> }
>>>>>>>>
>>>>>>>> *Converter gave out:*
>>>>>>>>
>>>>>>>> package main
>>>>>>>>
>>>>>>>> import (
>>>>>>>>         "fmt"
>>>>>>>>         "os"
>>>>>>>> )
>>>>>>>>
>>>>>>>> type TestExtension struct{}
>>>>>>>>
>>>>>>>> func main() {
>>>>>>>>
>>>>>>>>         var args []string = os.Args
>>>>>>>>
>>>>>>>>         var te TestExtension = TestExtension{}
>>>>>>>>         te.TestExtension_main(args)
>>>>>>>> }
>>>>>>>> func (testExtension *TestExtension) hello() {
>>>>>>>>         fmt.Println("hello")
>>>>>>>> }
>>>>>>>>
>>>>>>>> /** generated method **/
>>>>>>>> func (testExtension *TestExtension) TestExtension_main(args 
>>>>>>>> []string) {
>>>>>>>>
>>>>>>>>         var te ITestExtension = 
>>>>>>>> AddressTestExtension(TestExtension{})
>>>>>>>>         te.hello()
>>>>>>>>         te = AddressSecond(Second{})
>>>>>>>>         te.hello()
>>>>>>>>         te = AddressThird(Third{})
>>>>>>>>         te.hello()
>>>>>>>>         te = AddressFourth(Fourth{})
>>>>>>>>         te.hello()
>>>>>>>> }
>>>>>>>>
>>>>>>>> type Second struct {
>>>>>>>>         TestExtension
>>>>>>>> }
>>>>>>>>
>>>>>>>> func (second *Second) hello() {
>>>>>>>>         fmt.Println("Second")
>>>>>>>> }
>>>>>>>>
>>>>>>>> type Third struct {
>>>>>>>>         TestExtension
>>>>>>>> }
>>>>>>>>
>>>>>>>> func (third *Third) hello() {
>>>>>>>>         fmt.Println("Third")
>>>>>>>> }
>>>>>>>>
>>>>>>>> type Fourth struct {
>>>>>>>>         Third
>>>>>>>> }
>>>>>>>>
>>>>>>>> func (fourth *Fourth) hello() {
>>>>>>>>         fmt.Println("Fourth")
>>>>>>>> }
>>>>>>>>
>>>>>>>> type ITestExtension interface { 
>>>>>>>> /** Generated Method */
>>>>>>>>         hello()
>>>>>>>> }
>>>>>>>>
>>>>>>>> func AddressSecond(s Second) *Second                      { return 
>>>>>>>> &s }
>>>>>>>> func AddressThird(t Third) *Third                         { return 
>>>>>>>> &t }
>>>>>>>> func AddressTestExtension(t TestExtension) *TestExtension { return 
>>>>>>>> &t }
>>>>>>>> func AddressFourth(f Fourth) *Fourth                      { return 
>>>>>>>> &f }
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> *4. Now the Dynamic Dispatching absence. The problematic method in 
>>>>>>>>    the last sample is the amount() in class Repeater.    Without 
>>>>>>>> rewriting 
>>>>>>>> the code, I think it would be impossible to    invoke it correctly.*
>>>>>>>>
>>>>>>>> package main;
>>>>>>>>
>>>>>>>> public class Speaker {
>>>>>>>>   String message;
>>>>>>>>   public static void main(  String[] args){
>>>>>>>>     Speaker sp = new Speaker("Say hello !");
>>>>>>>>     System.out.println(sp.amount());
>>>>>>>>     sp.speak();
>>>>>>>>     Repeater rp = new Repeater("Say hello !",3);
>>>>>>>>     System.out.println(rp.amount());
>>>>>>>>     rp.speak();
>>>>>>>>   }
>>>>>>>>   public Speaker(  String message){
>>>>>>>>     this.message=message;
>>>>>>>>   }
>>>>>>>>   public void speak(){
>>>>>>>>     for (int i=0; i < amount(); i++) {
>>>>>>>>       System.out.println(this.message);
>>>>>>>>     }
>>>>>>>>   }
>>>>>>>>   public int amount(){
>>>>>>>>     return 1;
>>>>>>>>   }
>>>>>>>> }
>>>>>>>> class Repeater extends Speaker {
>>>>>>>>   int to_repeat=0;
>>>>>>>>   public Repeater(  String message,  int amount){
>>>>>>>>     super(message);
>>>>>>>>     this.to_repeat=amount;
>>>>>>>>   }
>>>>>>>>   public int amount(){
>>>>>>>>     return this.to_repeat;
>>>>>>>>   }
>>>>>>>> }
>>>>>>>>
>>>>>>>> *Converter gave out:*
>>>>>>>>
>>>>>>>> package main
>>>>>>>>
>>>>>>>> import (
>>>>>>>>         "fmt"
>>>>>>>>         "os"
>>>>>>>> )
>>>>>>>>
>>>>>>>> type Speaker struct {
>>>>>>>>         message string
>>>>>>>> }
>>>>>>>>
>>>>>>>> func main() {
>>>>>>>>
>>>>>>>>         var args []string = os.Args
>>>>>>>>
>>>>>>>>         var s_dummy Speaker = NewSpeaker("")
>>>>>>>>         s_dummy.Speaker_main(args)
>>>>>>>> }
>>>>>>>> func NewSpeaker(message string) Speaker {
>>>>>>>>
>>>>>>>>         var speaker Speaker = Speaker{message}
>>>>>>>>         return speaker
>>>>>>>> }
>>>>>>>> func (speaker *Speaker) speak() {
>>>>>>>>         for i := 0; i < speaker.amount(); i++ {
>>>>>>>>                 fmt.Println(speaker.message)
>>>>>>>>         }
>>>>>>>> }
>>>>>>>> func (speaker *Speaker) amount() int {
>>>>>>>>         return 1
>>>>>>>> }
>>>>>>>>
>>>>>>>> /** generated method **/
>>>>>>>> func (speaker *Speaker) Speaker_main(args []string) {
>>>>>>>>
>>>>>>>>         var sp ISpeaker = AddressSpeaker(NewSpeaker("Say hello !"))
>>>>>>>>         fmt.Println(sp.amount())
>>>>>>>>         sp.speak()
>>>>>>>>
>>>>>>>>         var rp ISpeaker = AddressRepeater(NewRepeater("Say hello 
>>>>>>>> !", 3))
>>>>>>>>         fmt.Println(rp.amount())
>>>>>>>>         rp.speak()
>>>>>>>> }
>>>>>>>>
>>>>>>>> type Repeater struct {
>>>>>>>>         Speaker
>>>>>>>>
>>>>>>>>         to_repeat int
>>>>>>>> }
>>>>>>>>
>>>>>>>> func NewRepeater(message string, amount int) Repeater {
>>>>>>>>
>>>>>>>>         var repeater Repeater = Repeater{NewSpeaker(message), 
>>>>>>>> amount}
>>>>>>>>         return repeater
>>>>>>>> }
>>>>>>>> func (repeater *Repeater) amount() int {
>>>>>>>>         return repeater.to_repeat
>>>>>>>> }
>>>>>>>> func (repeater *Repeater) speak() {
>>>>>>>>         for i := 0; i < repeater.amount(); i++ {
>>>>>>>>                 fmt.Println(repeater.message)
>>>>>>>>         }
>>>>>>>> }
>>>>>>>>
>>>>>>>> type ISpeaker interface { 
>>>>>>>>
>>>>>>>> /** Generated Method */
>>>>>>>>
>>>>>>>>         amount() int
>>>>>>>> /** Generated Method */
>>>>>>>>
>>>>>>>>         speak()
>>>>>>>> }
>>>>>>>>
>>>>>>>> func AddressRepeater(r Repeater) *Repeater { return &r }
>>>>>>>> func AddressSpeaker(s Speaker) *Speaker    { return &s }
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> *5. I will be thankful for any feedback. Thanks to everyone.*
>>>>>>>>
>>>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/7dc01ef5-187d-42d0-84d7-858cc7960143n%40googlegroups.com.

Reply via email to