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/a1304992-003a-4b13-aefc-2f5f6d4333b7n%40googlegroups.com.