I have a database with multiple tables, functions and triggers in public schema.
I want to create a user that can login to database and select on specific tables and cannot access to any functions, triggers and specific tables.
Can you clarify your intention/goal? You write that you want a user role to "select on specific tables" but "cannot access... specific tables." Do you mean you want by default a user role that can't access any functions, triggers or tables, and then can be "whitelisted" into access to a limited, defined list of tables?
Can you explain why this user should stop using public schema? Is that a general principle or related to this user's situation? (If general, should we add it to the "Don't Do This" page?)
In general the default permissions around the PUBLIC "group" and public schema mean that its difficult to know for certain whether you are dealing with an exclude-everything based permission tree. Avoiding anything to do with the "public" role/schema beyond initial learning of the system is something I recommend generally.
Any system of non-trivial complexity should use schemas to describe different categories of objects. "public" is a catch-all category that should go unused as everything should be assigned to a well defined category/schema.