Hi, sorry for delay.
Despite my great interest in this task, I can not spend a lot of time on 
the project. But you're right, everything I've posted on go-nuts shows that 
conversion is very possible and in the same context that you're 
considering, if I understand you correctly of course . So far it looks like 
this:
syntactic analysis,
semantic analysis,
then there is code generation on Go from AST.
Regards,

четверг, 18 августа 2022 г. в 21:58:03 UTC+3, Oliveira Jose Carlos de - 
ICTS BSA: 

> 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/100feb87-3a53-49b7-b09e-94fb5330cde6n%40googlegroups.com.

Reply via email to